java8

58 阅读2分钟

stream

中间操作,每次返回一个新的流可以有多个

终端操作,每个流只能进行一次终端操作,终端操作结束后流无法再次使用。终端操作会产生一个新的集合或值。

image.png

无状态:指元素的处理不受之前元素的影响;

有状态:指该操作只有拿到所有元素之后才能继续下去。

非短路操作:指必须处理所有元素才能得到最终结果;

短路操作:指遇到某些符合条件的元素就可以得到最终结果,如 A || B,只要A为true,则无需判断B的结果。

创建流

List<String> list = Arrays.asList("a", "b", "c");
// 创建一个顺序流
Stream<String> stream = list.stream();
// 创建一个并行流
Stream<String> parallelStream = list.parallelStream();

stream和 parallelStream的简单区分:stream是顺序流,由主线程按顺序对流执行操作,而 parallelStream是并行流,内部以多线程并行执行的方式对流进行操作,但前提是流中的数据处理没有顺序要求。例如筛选集合中的奇数,两者的处理不同之处:

map

Stream.map()Stream最常用的一个转换方法,它把一个Stream转换为另一个Stream
map操作,把一个Stream的每个元素一一对应到应用了目标函数的结果上

public class Main {
    public static void main(String[] args) {
        List.of("  Apple ", " pear ", " ORANGE", " BaNaNa ")
                .stream()
                .map(String::trim) // 去空格
                .map(String::toLowerCase) // 变小写
                .forEach(System.out::println); // 打印
    }
}

函数式编程

函数式编程(Functional Programming)是把函数作为基本运算单元,函数可以作为变量,可以接收函数,还可以返回函数。

FunctionalInterface

只定义了单方法的接口称之为FunctionalInterface,用注解@FunctionalInterface标记。

Lambda表达式

  • Lambda表达式的参数和返回值均可由编译器自动推断。
  • lambda表达式仅能放入如下代码: 预定义使用了 @Functional 注释的函数式接口,自带一个抽象函数的方法,或者SAM(Single Abstract Method 单个抽象方法)类型。
  • lambda表达式限制,只能引用 final 或 final 局部变量,

方法引用

构造引用

Supplier<Student> s = Student::new;

类名::静态方法

Stream<Double> stream = Stream.generate(Math::random);

类名::实例方法

TreeSet<String> set = new TreeSet<>(String::compareTo);

blog.csdn.net/qq_45228323… blog.csdn.net/weixin_4584…