总结:
filter过滤器的return 就是执行完了器其一次过滤操作,map的return 就是执行完了其一次修操作,filte,map都是要晚于collect方式执行--调试还要注意分行写
单语句不需要{}和return可以省略 ,多语句需要
示例:
通常在开发程序时候都会对程序进行单步或设置断点调试代码。而在Java 8中在使用stream时采用这种方式调试却与原有的方式稍有不同。
List<String> nations = Arrays.asList("A","B","C");
Set<String> nationalities = new HashSet<>();
for (String nation : nations) {
if (nation.startsWith("A")) {
System.out.println("Found nationality: " + nation);
nationalities.add(nation);
}
}
上面这段代码,当满足if条件时,我们可以将满足条件的结果输出,以验证程序是否正确执行。若通过Java 8中的stream来改写上述操作,代码如下。
nations.stream().filter((s) -> s.startsWith("A")).forEach(
nationality -> System.out.println("Found: " + nationality));
我们通过forEach来输出过滤后的结果。然而这样做,将无法再继续在这个流上进行操作。如果还想继续对该流进行操作,那么需要重新建立这个流。例如还希望进行map操作并观察结果。
nations.stream().filter((s) -> s.startsWith("A"))
.map((param) -> param + "/")
.forEache(nationality -> System.out.println("Found: " + nationality));
为了观察中间结果,便于调试改错,我们可以通过peek方法来完成。
List<String> nations = Arrays.asList("A","B","C","A1");
nations.stream().
filter(nation -> {
return nation.startsWith("A");
}).
peek(nation -> System.out.println(nation)).
map((t) -> {
return t + "a";
}).
peek(nation -> System.out.println(nation)).
collect(Collectors.toList());
这样便可以观察每一步的中间结果。
此外我们还可以通过设置断点的方式来观察结果。
这里写图片描述
注意,stream中的map属于惰性操作(Lazy operation),即当终结操作发生后才会执行map,filter同理。在这里终结是指collect。此外在设置断点时需要将stream调用的方法分多行写出,例如上图所示。通过上述方法可以观察Stream中的结果,进行代码调试。
参考:
1.http://stackoverflow.com/questions/24541786/how-to-debug-stream-map-with-lambda-expressions
2.Java 8 lambda,Chapter7
相关推荐
3. **默认方法**:在Java 8的接口中,可以定义带有实现的默认方法。这使得接口可以随着版本更新而添加新的方法,而不破坏已有的实现。 4. **Stream API**:这是一个强大的新功能,可以对集合进行高效的操作,如过滤...
在Java 8中,引入了许多新特性和改进,旨在提高开发效率和代码的可读性。以下是一些主要知识点: 1. **Lambda表达式**:这是Java 8最大的变革之一,它允许以更简洁的方式表示匿名函数。Lambda表达式使得编写函数式...
7. ** Nashorn JavaScript引擎**:Java 8中引入了Nashorn JavaScript引擎,允许在Java应用程序中直接执行JavaScript代码,实现了Java与JavaScript之间的互操作性。 以上是关于“Java 8 官方免安装包+中文api”...
6. **默认方法**:在接口中,Java 8 允许定义带有实现的默认方法,用 `default` 关键字表示。这使得接口升级时,不会破坏已有的实现类,如 `java.util.Comparator` 接口中的 `thenComparing()` 方法。 7. **接口的...
10. **新的枚举语法**:在Java 8中,可以在枚举类中定义接口,并让枚举实例直接实现这些接口,简化了枚举的使用。 通过下载JDK 1.8的zip或rar压缩文件,用户可以快速方便地获取完整的Java开发环境。解压文件后,...
5. **默认方法**:在接口中添加了带有实现的方法,使得接口能更好地适应演进的需求,而无需修改已实现该接口的类。 6. **新的Optional类**:用于表示可能为null的值,帮助开发者避免空指针异常,提高了代码的健壮性...
6. **默认方法**:接口在Java 8中增加了默认方法(default methods)的特性,允许在接口中定义带实现的方法,不强制实现类覆盖,这样可以避免破坏现有的接口实现。 7. **Optional类**:为了解决Java中的null安全...
Stream API是Java 8中另一个重要的新特性,它提供了对集合数据进行高效、声明性处理的方法。通过流,你可以对集合进行过滤、映射、归约等操作,非常适合进行数据处理和转换。例如,我们可以方便地找出一个列表中的...
5. **默认方法**:接口在Java 8中增加了默认方法,允许接口定义实现代码,这使得接口可以在不破坏向后兼容性的情况下添加新的功能。 6. ** Nashorn JavaScript引擎**:Java 8引入了Nashorn JavaScript引擎,允许在...
7. **默认方法**:在接口中,Java 8允许定义带有默认实现的方法,这使得在不破坏向后兼容性的前提下,可以向已有的接口添加新方法。 8. **Nashorn JavaScript引擎**:Java 8包含了Nashorn JavaScript引擎,允许在...
3. **Lambda表达式**: Lambda表达式是JDK8中的一个重大革新,它使得函数式编程风格在Java中变得更加简洁。Lambda表达式可以看作是无名函数,可以在需要函数对象的地方使用,减少了代码量并提高了可读性。 4. **函数...
- **默认方法**:允许在接口中定义带有实现的方法,增强了接口的功能。 - **Volatile增强**:提升了并发性能,降低了内存可见性问题。 这些特性极大地提高了Java的开发效率和程序的性能。总的来说,"java8 jdk1.8...
6. **默认方法**:在接口中,Java 1.8引入了默认方法的概念,允许接口中定义带有实现的方法,为接口添加新的功能,同时保持向后兼容性。 7. ** Nashorn JavaScript引擎**:Java 1.8集成了Nashorn JavaScript引擎,...
在Java 8中,`Runnable`、`Callable`和新的`Consumer`、`Supplier`、`Function`等接口都属于函数接口。这些接口配合Lambda表达式使用,可以方便地实现函数式编程风格。 Stream API是JDK 1.8新增的数据处理模型,它...
4. **Stream API**:Stream API是Java 8新加入的一个重要特性,它提供了对集合进行高效且声明式的数据处理能力,支持并行操作,可以方便地进行过滤、映射、归约等操作。 5. **Date和Time API**:Java 8对日期和时间...
在Java SE 8中,引入了一系列重要的新特性和改进,其中包括: 1. **lambda表达式**:这是Java 8的一项重大革新,它允许开发者以更简洁的方式处理函数式编程场景,减少了匿名内部类的使用。Lambda表达式可以被赋值给...
4. **默认方法**:在接口中,Java 8引入了默认方法的概念,允许在接口中定义带有实现的方法,这使得接口升级变得更加灵活,同时避免了对现有实现的破坏。 5. **日期和时间API的改进**:Java 8提供了新的`java.time`...
9. **类型推断增强**:在JDK8中,类型推断机制得到加强,尤其是对于lambda表达式和方法引用来说,编译器能更准确地推断出隐含的类型。 10. **并行GC优化**:JDK8对垃圾收集器进行了改进,如G1垃圾收集器的优化,...
10. **重复注解**:在Java 8中,可以在同一元素上使用多个相同类型的注解,而不会引发错误。 配置Java环境变量是使用Java开发工具的基础步骤。通常需要设置两个环境变量: - `JAVA_HOME`:指向JDK的安装目录,例如`...
Java API 1.8引入了许多新特性,包括Lambda表达式、Stream API、默认方法、新的日期时间API、并发改进等,这些都是Java 8的重要更新。 1. Lambda表达式:Lambda表达式是Java 8引入的一种简洁的匿名函数表示形式,它...