java8学习
函数式
函数式接口就是只定义一个抽象方法的接口
函数式接口的抽象方法的签名称为函数描述符。
- Predicate:java.util.function.Predicate
接口定义了一个名叫test的抽象方法,它接受泛型T对象,并返回一个boolean。 - Consumer:java.util.function.Consumer
接口定义了一个名叫accept的抽象方法,它接受泛型T的对象,没有返回(void)。 - Function:java.util.function.Function<T, R>接口定义了一个叫作apply的抽象方法,它接受泛型T的对象,并返回一个泛型R的对象。
- DoublePredicate、IntConsumer、LongBinaryOperator、IntFunction、ToIntFunction
、IntToDoubleFunction
- Predicate:java.util.function.Predicate
流
常用方法
- filter 筛选
- distinct 去重 (据流所生成元素的hashCode和equals方法实现)
- 切片
- takeWhile 遭遇第一个不符合要求的元素时停止处理
- dropWhile 它会从头开始,丢弃所有谓词结果为false的元素。一旦遭遇谓词计算的结果为true,它就停止处理,并返回所有剩余的元素,即便要处理的对象是一个由无限数量元素构成的流,它也能工作得很好
- limit 截短流
- skip 跳过元素
- map 映射 (使用映射一词,是因为它和转换类似,但其中的细微差别在于它是“创建一个新版本”而不是去“修改”)
- flatMap 扁平化为一个流,把一个流中的每个值都换成另一个流,然后把所有的流连接起来成为一个流
- allMatch 匹配所有元素
- anyMatch 至少匹配一个
- noneMatch 没有任何匹配元素
- findAny 返回当前流中的任意元素
- findFist 查找第一个元素
原始类型流特化
Java 8引入了三个原始类型特化流接口来解决这个问题:IntStream、DoubleStream和LongStream,分别将流中的元素特化为int、long和double,从而避免了暗含的装箱成本。
常用方法
mapToInt、mapToDouble和mapToLong
转换回对象流
boxed
数值范围
- range 不包含结束值
- rangeClosed 包含结束值
构建流
由值创建流
Stream<String> java = Stream.of("java", "php", "js");
Stream<Object> empty = Stream.empty(); //创建空流
由数组创建流
int[] numbers = {2,3,4,5,11,23};
IntStream stream = Arrays.stream(numbers);
由文件生成流
由函数生成无限流
- Stream.iterate
- Stream.generate
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 haominglfs的博客!