Java8引入了Stream以实现对集合更方便地进行函数式编程。
Set和List都可以通过stream()方法获取Stream实例;
数组可以通过Arrays.stream(array)工具方法获取Stream实例。
对Stream的操作分lazy方法和eager方法:
lazy方法依然返回Stream实例,并没有立马开始计算;
而eager方法相当于正式进入运算阶段,返回的类型由具体方法决定。
以下是操作Stream的常见方法,这些方法的操作效果可以参照reactivex编程的数据流图,同一个方法名的操作大体是一致的,何况java reactivex编程和Lambda的结合还是比较紧密的:
RxMarbles -- Interactive diagrams of Rx Observables
先定义一个用于测试的类
class Item { public String id; public int count; public Item(String id, int count) { this.id = id; this.count = count; } }
然后初始化了如下三个实例
Item item1 = new Item("it1", 1); Item item2 = new Item("it2", 2); Item item3 = new Item("it3", 3);
和一个Item列表
List<Item> list = new ArrayList<>(); list.add(item1); list.add(item2); list.add(item3);
1. forEach -- eager方法,循环对每个元素执行相关指令
list.stream().forEach(item -> System.out.println(item.id));
这段代码单独放在这边没有什么意义,可以用于下面lazy方法的调试
2. filter -- lazy方法,用于过滤数据
list.stream() .filter(item -> item.count > 2) .forEach(item -> System.out.println(item.id));输出的结果只包含it3。
3. map -- lazy方法,用于转变Stream
list.stream() .map(item -> item.id) //从Item的Stream转变成了String的Stream .forEach(System.out::println);类似的还有mapToInt、mapToLong、mapToDouble,传入的lambda或者函数应该返回int、long、double类型的数据,转换成的Stream依次为IntStream、LongStream、DoubleStream,这些类型的Stream有自己专有的成员函数用于简化相关的计算,例如sum()返回加和。
4. flatMap -- lazy方法,用于将多个Stream转换成一个Stream
Arrays.stream(new String[]{"A,B,C", "D,E"}) .flatMap(s -> Arrays.stream(s.split(","))) .forEach(System.out::println);flatMap中的lambda或函数需要返回Stream,这边将字符串数组中的每个字符串按逗号切分转换成了两个Stream,然后flatMap将这两个Stream合并成了一个大的Stream;flatMap也有map类似的三个的额外方法。
5. reduce -- eager方法,实现从一组值中生成一个值
OptionalInt sum = Arrays.stream(new int[]{1, 2, 3}) .reduce((left, right) -> left + right); System.out.println(sum.orElse(0));
这边通过reduce实现求知的效果,由于没有设置初始值,所以返回的是一个Optional类型的对象,该对象的作用在于警示有可能返回的值不存在,需要先判断再取值。
进一步演示通过reduce查找Item列表中count最大的元素
Item res = list.stream() .reduce(item1, (left, right) -> left.count > right.count ? left : right); System.out.println(res.id);
reduce中传入的lambda或函数应该起到两个元素变成一个的作用。
6. sum、count、min、max -- eager方法,可以认为是封装reduce后的常用方法
Optional<Item> min = list.stream() .min(Comparator.comparingInt(item -> item.count));
7. collect -- eager方法,用于将Stream转换成集合或Map
Set<Integer> set = list.stream() .filter(item -> item.count > 2) .map(item -> item.count) .collect(Collectors.toSet());
collect还有其他高阶的用法,之后再补充
以上都只演示了比较简单的处理逻辑,对于复杂的逻辑可以写在函数中,然后将该函数作为相关方法的参数。
关于引入Stream对java语法的影响:
1. interface里面可以实现方法,但是必须用default修饰
比如Collection中生成Stream的接口,主要还是为了兼容以前的代码
default Stream<E> stream() { return StreamSupport.stream(spliterator(), false); }
The Three Rules
If you’re ever unsure of what will happen with default methods or with multiple inheritance of behavior, there are three simple rules for handling conflicts:
1. Any class wins over any interface. So if there’s a method with a body, or an abstract declaration, in the superclass chain, we can ignore the interfaces completely.
2. Subtype wins over supertype. If we have a situation in which two interfaces are competing to provide a default method and one interface extends the other, the subclass wins.
3. No rule 3. If the previous two rules don’t give us the answer, the subclass must either implement the method or declare it abstract.
Rule 1 is what brings us compatibility with old code.
2. interface里面可以有static方法
比如Stream.of()
public static<T> Stream<T> of(T... values) { return Arrays.stream(values); }
相关推荐
Stream和Lambda表达式实践 在Java中,Stream API是Java 8中引入的一种新的数据处理方式,它可以对集合进行各种操作,如过滤、映射、聚合等。Lambda表达式是Java 8中引入的一种新的函数式编程方式,它可以将函数作为...
【Java8】Lambda表达式 和 Stream API 是Java编程语言中的两个重要创新,它们极大地提升了代码的简洁性和可读性,特别是在处理集合数据时。这里我们将深入探讨这两个特性,并结合实际示例来理解它们的工作原理。 ...
该PPT为本人翻遍大部分帖子、博客、资源等一系列资料自我整合了一套技术分享PPT,以Java为载体,概括了Lambda表达式的使用概念、函数式编程的思想,以及Stream流的各个方法的使用,Stream流的强大功能等。
例如,一个简单的Lambda表达式`(int a, int b) -> a + b`表示一个接受两个整数参数并返回它们之和的函数。参数类型可以省略,如果编译器能推断出类型的话。 在Java中,Lambda表达式与功能接口紧密相关。功能接口是...
例如,一个接受两个整数并返回它们之和的Lambda表达式可以写作`(int a, int b) -> a + b`。 3. **函数式接口** Lambda表达式与函数式接口紧密相关。函数式接口是指只有一个抽象方法的接口。Java8提供了许多内置的...
Java 8 引入的 Lambda 表达式是 Java 编程语言的重大变革之一,它允许以更简洁的方式表示单方法接口的实现,极大地增强了 Java 语言的表达能力,尤其是结合了函数式接口、Stream API 和其他新特性后。接下来,我们将...
- **函数式编程**:Java 8引入了`java.util.Function`等接口,以及`Stream API`,允许开发者使用lambda表达式进行函数式编程,如映射、过滤、聚合等操作。 4. **并行处理**:通过`java.util.concurrent.ForkJoin...
3. **方法引用**:当Lambda体完全等同于某个已存在的方法时,可以使用方法引用来替代Lambda表达式,如 `Arrays.sort(list, Comparator.comparingInt(Integer::intValue))`。 4. **构造器引用**:同样,Lambda 表达式...
Lambda表达式和stream流的入门 java 响应式编程
Lambda表达式还可以与Java 8的并行流(Parallel Stream)结合,利用多核处理器的优势进行并行计算,提高程序执行效率。例如: ```java long sum = numbers.parallelStream().mapToInt(Integer::intValue).sum(); ``` ...
Lambda表达式是Java 8引入的关键特性之一,它极大地简化了函数式编程,使得Java开发者能够更有效地处理并发问题,从而更好地利用现代计算机的多核处理器资源。 Lambda表达式的核心概念在于它的简洁性和可传递性。它...
JDK8特性(Lambda表达式+StreamAPI的简单使用示例代码)
Lambda表达式的引入,主要是为了支持Stream API和函数式接口的使用,从而提高了处理集合数据的效率。 Lambda表达式的基本语法格式如下: ```java (parameters) -> expression 或 (parameters) -> { statements; } `...
3. 内部迭代:Lambda表达式与Stream API结合,使得内部迭代成为可能,简化了集合的处理过程。 4. 方法引用:Lambda表达式的增强形式,通过使用::语法直接引用方法。 5. 并行处理:Lambda表达式支持并行处理,可以在...
Java8发布到现在至少3年了,但是对Lambda表达式不熟悉、看不懂、不会用的现象非常...本系列课程从Lambda表达式、方法的引用、Stream API三处着手分析Lambda表达式的使用。 通过大量的实战例子讲解如何使用Lambda表达式
6. `Stream API`结合Lambda表达式进行数据处理,如`map`, `filter`, `reduce`等操作。 通过对这个测试代码的学习,你可以深入理解Lambda表达式的各种应用场景和用法,提高Java编程的效率和代码的可读性。Lambda...
根据给定文件信息,内容主要围绕Java中Lambda表达式对集合进行操作,以下是详细的知识点: 1. Lambda表达式基础: Lambda表达式是Java 8引入的一种简洁的表示可传递的匿名函数的方式。它允许我们将函数作为参数传递...
Java 8的Stream API支持并行处理,通过`parallelStream()`方法,结合Lambda表达式可以实现高效的并行计算。 **类库篇:** 1. **Stream API**: Stream API是Java 8的重要更新,它提供了诸如`filter()`, `map()`,...