行为化参数
Java8内置的四大核心函数式接口:
Consumer:消费型接口
void accept(T t);Supplier:供给型接口
T get();Function
:函数型接口
R apply(T t);Predicate:断言型接口
boolean test(T t);
Stream
流API
要想记住这些方法,最简单的方式就是多查看 Stream 类的 API
原始类型流特化
IntStream,DoubleStream,LongStream
要记住,这几个特化的原因并不在于流的复杂性,而是装箱造成的复杂性—-即类似 int 和 Integer 之间的效率差异。
基本使用(求和):
int sum = menu.stream()
.mapToInt(Dish::getCalories) // 注意,若使用map会返回Stream<Integer>,它是没有sum操作的
.getCalories();
默认值 OptionalInt(求最大值):
OptionalInt maxCalories = menu.stream()
.mapToInt(Dish::getCalories)
.max();
// 若没有最大值,就可以显示处理默认值了
int max = maxCalories.orElse(1);
转换回对象流:
IntStream intStream = menu.stream().mapToInt(Dish::getCalories);
Stream<Integer> stream = intStream.boxed();
数值范围:
// 一个从1到100的偶数流,计算偶数个数 --》 有50个,rangeClose包含结尾
IntStream evenNumbers = IntStream.rangeClosed(1, 100).filter(i -> i % 2 == 0);
// 如果使用 range,则只有49个,因为 range 是不包括结尾的
构建流
值创建流:
Stream<String> stream = Stream.of("Java8", "In", "Action");
// 如果想得到一个空流,则如下
Stream<String> empty = Stream.enpty();
数组构建流:
// 注意这里构造的是 IntStream,所有就有 sum 方法了,Stream是没有sum方法的
int sum = Arrays.stream(new int[]{1, 2}).sum();
文件创建流:
Java 中的 NIO ;Files 工具类
// 会返回每一行为一个字符串流
Stream<String> lines = Files.lines(Paths.get("data.txt"), Charset.defaultCharset()) ;
Collectors收集器静态方法
toList() | List |
将流中所有项目收集到一个List | List |
---|---|---|---|
toSet() | Set |
将流中所有项目收集到一个Set | Set |
toCollection | Collection |
将数据转换为指定的集合 | Collection |
counting() | Long | 计算流中数量 | long l = stream.collect(counting()); |
summingInt() | Integer | 返回流中整数属性求和 | int i = stream.collect(summingInt( T::getXX )); |
averagingInt() | Double | 计算流中Integer属性的平均值 | double d = stream.collect(averagingInt(T::getXX)); |
summarizingInt() | IntSummaryStatistics | 收集流中Integer属性的统计值 | IntSummaryStatistics i = stream.collect(summarizingInt(T::getXX)); |
joining() | String | 将流中每个元素调用toString方法拼接 | String s = stream.collect(joining(“ , “); |
maxBy() | Optional |
筛选流中最大元素的Optional,流为空则Optional.empty() | Optional |
minBy() | Optional |
筛选流中最小元素的Optional,流为空则Optional.empty() | Optional |
reducing() | 归约操作产生的类型 | 从初始值开始,利用BinaryOperator与流中每个元素相结合,从而将流归约成单个值 | int i = stream.collect(reducing(0, T::getXX, Integer :: sum)); |
collectingAndThen() | 转换函数返回的类型 | 包裹一个收集器,对其结果应用转换函数 | int i = stream.collect(collectingAndThen(toList(),List :: size); |
groupingBy() | Map |
根据流中一个属性的值做分组,并以该属性为Map的一个Key | Map |
partitioningBy() | Map |
根据对流中的每个元素的应用谓词的结果进行分区(true,false) | Map |
作者:Snow_DZG
链接:https://www.jianshu.com/p/a9ad46f86fb4
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。 |