首页  

Java8 Stream 及 常见坑点     所属分类 java8 浏览量 280
Java8 函数式编程 lambda 方法引用 Stream流
Stream Java8新增的一个接口,以声明性方式处理数据集合
流水线
数据源+零或者多个中间操作+一个终端操作


Stream特点
只能遍历(消费)一次
保护数据源
lazy 中间运算 filter map  , 终端操作(如collect)


Stream 创建 Stream strStream = Stream.of("hello", "java8", "stream"); IntStream intStream = IntStream.of(1, 2, 3); List intList = Arrays.asList(4,5,6); Stream integerStream = intList.stream(); Integer[] array = {7, 8, 9}; integerStream = Arrays.stream(array); Random random = new Random(); intStream = random.ints().limit(3); integerStream = Stream.generate(random::nextInt).limit(3); // 生成3个奇数 integerStream = Stream.iterate(1, n -> n + 2).limit(3); Stream pathStream = Files.list(Paths.get("/"));
Stream常用操作 两类操作 中间操作 filter map 等 终端操作 foreach min max count collect 等 List words = Arrays.asList("hello", "java8", "stream"); // 计算每个单词的长度 List list = words.stream().map(String::length).collect(Collectors.toList()); // 5 5 6 list.forEach(System.out::println); words = Arrays.asList("a", "b-c", "d-e-f"); List list1 = words.stream().map(word -> word.split("-")).collect(Collectors.toList()); list1.forEach(System.out::println); Stream strStream2 = words.stream().map(word -> word.split("-")).flatMap(Arrays::stream).distinct(); strStream2.forEach(System.out::println); List words2 = Arrays.asList("hello", "java8", "stream"); words2.stream() .filter(word -> word.length() > 5) .collect(Collectors.toList()) .forEach(System.out::println); List integers = Arrays.asList(7, 9, 8); integers.stream().max(Integer::compareTo).ifPresent(System.out::println);
常见错误 重复使用流 Stream strStream3 = Stream.of("hello", "java8", "stream"); strStream3.forEach(System.out::println); // java.lang.IllegalStateException: stream has already been operated upon or closed try { strStream3.forEach(System.out::println); }catch(Exception e) { System.out.println(e); } 修改数据源 List strings = Arrays.asList("hello", "java8", "stream"); // java.lang.UnsupportedOperationException strings.stream() .map(s -> { strings.add("world"); return s.toUpperCase(); }).forEach(System.out::println);
完整代码 https://gitee.com/dyyx/hellocode/blob/master/src/dyyx/java8/StreamTest4.java
JAVA8 stream 集合处理

上一篇     下一篇
JDK15和ZGC

Java8 Lambda表达式排序实战

java方法引用实例

java方法引用

OSGI与Java模块化之路

Lambda表达式与匿名内部类的区别