摘要:和不同,其没有接收参数。用于剔除重复,与数据库中的用法一致。可以对整型流求最大值,返回。这两个方法是结束操作,只能调用一次。
常用的函数接口记录方便以后翻吧
接口 | 参数 | 返回类型 | 说明 |
---|---|---|---|
Predicate |
T | boolean | 输入某个值,输出boolean 值,用于对某值进行判定 |
Consumer |
T | void | 输入某值,无输出。用于消费某值 |
Function |
T | R | 输入某类型值,输出另种类型值,用于类型转化等 |
Supplier |
None | T | 无输入,输出某值,用于生产某值 |
UnaryOperator |
T | T | 输入某类型值,输出同类型值,用于值的同类型转化,如对值进行四则运算等 |
BinaryOperator |
(T,T) | T | 输入两个某类型值,输出一个同类型值,用于两值合并等 |
Predicates是包含一个参数的布尔值接口。其包括一些缺省方法,组合他们使用可以实现复杂的业务逻辑(如:and, or, negate)。示例代码如下:
Predicatepredicate = (s) -> s.length() > 0; predicate.test("foo"); // true predicate.negate().test("foo"); // false Predicate nonNull = Objects::nonNull; Predicate isNull = Objects::isNull; Predicate isEmpty = String::isEmpty; Predicate isNotEmpty = isEmpty.negate();
Functions接口接收一个参数并产生一个结果。其缺省方法通常被用来链接多个功能一起使用 (compose, andThen)。
FunctiontoInteger = Integer::valueOf; Function backToString = toInteger.andThen(String::valueOf); backToString.apply("123"); // "123"
Suppliers接口生成一个给定类型结果。和Functions不同,其没有接收参数。
SupplierpersonSupplier = Person::new; personSupplier.get(); // new Person
Consumers表现执行带有单个输入参数的操作。
Consumergreeter = (p) -> System.out.println("Hello, " + p.firstName); greeter.accept(new Person("Luke", "Skywalker"));
Comparators是从java旧版本升级并增加了一些缺省方法。
ComparatorStream 常用方法comparator = (p1, p2) -> p1.firstName.compareTo(p2.firstName); Person p1 = new Person("John", "Doe"); Person p2 = new Person("Alice", "Wonderland"); comparator.compare(p1, p2); // > 0 comparator.reversed().compare(p1, p2); // < 0
将现有数据结构转化成Stream
Streams = Stream.of(1, 2, 3, 4, 5); Stream s = Arrays.stream(arr); Stream s = aList.stream();
通过Stream.generate()方法:
// 这种方法通常表示无限序列 Streams = Stream.generate(SuppLier s); // 创建全体自然数的Stream class NatualSupplier implements Supplier { BigInteger next = BigInteger.ZERO; @Override public BigInteger get() { next = next.add(BigInteger.ONE); return next; } }
通过其他方法返回
Streamlines = Files.lines(Path.get(filename)) ...
把一种操作运算映射到Stream的每一个元素上,从而完成一个Stream到另一个Stream的转换
map方法接受的对象是Function接口,这个接口是一个函数式接口:
Stream map(Function super T, ? extends R> mapper); @FunctionalInterface public interface Function { // 将T转换为R R apply(T t); }
使用:
// 获取Stream里每个数的平方的集合 Streamns = Stream.of(1, 2, 3, 4, 5); ns.map(n -> n * n).forEach(System.out::println);
map方法是一个一对一的映射,每输入一个数据也只会输出一个值。
flatMap方法是一对多的映射,对每一个元素映射出来的仍旧是一个Stream,然后会将这个子Stream的元素映射到父集合中:
Stream> inputStream = Stream.of(Arrays.asList(1), Arrays.asList(2, 3), Arrays.asList(4, 5, 6)); List
integerList = inputStream.flatMap((childList) -> childList.stream()).collect(Collectors.toList()); //将一个“二维数组”flat为“一维数组” integerList.forEach(System.out::println);
filter方法用于过滤Stream中的元素,并用符合条件的元素生成一个新的Stream。
filter方法接受的参数是Predicate接口对象,这个接口是一个函数式接口:
Streamfilter(Predicate super T>) predicate; @FunctionInterface public interface Predicate { // 判断元素是否符合条件 boolean test(T t); }
使用
// 获取当前Stream所有偶数的序列 Streamns = Stream.of(1, 2, 3, 4, 5); ns.filter(n -> n % 2 == 0).forEach(System.out::println);
limit用于限制获取多少个结果,与数据库中的limit作用类似,skip用于排除前多少个结果。
sorted函数需要传入一个实现Comparator函数式接口的对象,该接口的抽象方法compare接收两个参数并返回一个整型值,作用就是排序,与其他常见排序方法一致。
distinct用于剔除重复,与数据库中的distinct用法一致。
findFirst方法总是返回第一个元素,如果没有则返回空,它的返回值类型是Optional
Streamstream = users.stream(); Optional userID = stream.filter(User::isVip).sorted((t1, t2) -> t2.getBalance() - t1.getBalance()).limit(3).map(User::getUserID).findFirst(); userID.ifPresent(uid -> System.out.println("Exists"));
min可以对整型流求最小值,返回OptionalInt。
max可以对整型流求最大值,返回OptionalInt。
这两个方法是结束操作,只能调用一次。
allMatch:Stream中全部元素符合传入的predicate返回 true
anyMatch:Stream中只要有一个元素符合传入的predicate返回 true
noneMatch:Stream中没有一个元素符合传入的predicate返回 true
reduce方法将一个Stream的每一个元素一次作用于BiFunction,并将结果合并。
reduce方法接受的方法是BinaryOperator接口对象。
Optionalreduce(BinaryOperator accumulator); @FuncationalInterface public interface BinaryOperator extends BiFunction { // Bi操作,两个输入,一个输出 T apply(T t, T u); }
使用:
// 求当前Stream累乘的结果 Streamns = Stream.of(1, 2, 3, 4, 5); int r = ns.reduce( (x, y) -> x * y ).get(); System.out.println(r);
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/73566.html
摘要:函数式接口进阶与默认方法详解上一篇我们快速的借助示例演示了的简单应用,体会到了使用对集合处理的便捷和其与函数式接口密不可分的关系,所以为了更高效的使用,有必要更熟练的掌握函数式接口。 Java8-5-函数式接口进阶与默认方法详解上一篇我们快速的借助示例演示了stream api的简单应用,体会到了使用stream api对集合处理的便捷和其与函数式接口密不可分的关系,所以为了更高效的使...
摘要:所以通过上面的例子可以看出函数式编程和结合的非常紧密。小结本篇简单介绍了函数式编程与应用及类方法引用的使用,表达式让老版本的代码更简洁,方法引用让表达式更简洁,实际上就是表达式的一种语法糖。 上一篇文章中,我们介绍了几个Java8内置的函数式接口的特点和使用方式,并在最后引出了stream api的知识点,接下来我们开始学习Java8中的stream api。先假设一个简单的需求,存在...
摘要:接下来看下如果使用提供的接口会有哪些改进首先看下接口定义省略该函数式接口唯一的抽象方法接收一个参数,有返回值。是不是有点体验到函数式编程的灵活之处。 上一篇文章中,我们总体介绍了创建函数式接口实例的几种方式以及Java8中接口新增的默认方法特性,接下来我们来看下Java8中已经为我们提供的几种典型的函数式接口先看一个示例 public class FunctionTest { ...
摘要:的主要新特性表达式允许把函数作为一个方法的参数传递进方法中。作用解决被诟病的匿名内部类的问题。新特性模块系统模块是一个包的容器,最大的变化之一是引入模块系统。支持标准标准是协议的最新版本,新的支持和流以及服务器推送特性。 Java 8 的主要新特性 1. Lambda 表达式 Lambda 允许把函数作为一个方法的参数传递进方法中。 作用:解决 Java 被诟病的匿名内部类的问题。 2...
摘要:数据流教程原文译者飞龙协议这个示例驱动的教程是数据流的深入总结。但是的数据流是完全不同的东西。数据流是单体,并且在函数式编程中起到重要作用。列表上的所有流式操作请见数据流的。基本的数据流使用特殊的表达式,例如,而不是,而不是。 Java 8 数据流教程 原文:Java 8 Stream Tutorial 译者:飞龙 协议:CC BY-NC-SA 4.0 这个示例驱动的教程是J...
阅读 1558·2021-10-18 13:35
阅读 2341·2021-10-09 09:44
阅读 788·2021-10-08 10:05
阅读 2681·2021-09-26 09:47
阅读 3538·2021-09-22 15:22
阅读 413·2019-08-29 12:24
阅读 1928·2019-08-29 11:06
阅读 2837·2019-08-26 12:23