lambda表达式
语法
最常用的:
Runnable runnable = () -> System.out.println("Hello!");
Thread t = new Thread(runnable);
t.start();
t.join();
你还可以这么写:
Thread t = new Thread(() -> System.out.println("Hello!"));
t.start();
t.join();
带有参数的呢?
Comparator<String> stringComparator = (s1, s2) -> s1.compareTo(s2);
扩展成一个完整的表达式:
Comparator<String> stringComparator = (String s1, String s2) -> {
System.out.println("Comparing...");
return s1.compareTo(s2);
};
函数式接口
Lambda表达式使得你可以更紧凑地表达出单方法类。单一方法类也被称作函数式接口,它可以通过
@FunctionalInterface来进行注解:
@FunctionalInterface
public interface MyFunctionalInterface<T> {
boolean test(T t);
}
// Usage
MyFunctionalInterface<String> l = s -> s.startsWith("A");
方法引用
方法引用就是更紧凑,易懂的Lambda表达式,它适用于那些已经有名字的方法。来看一个简单的例子:
public class Sample {
public static void main(String[] args) {
Runnable runnable = Sample::run;
}
private static void run() {
System.out.println("Hello!");
}
}
还有一个:
public static void main(String[] args) {
Sample sample = new Sample();
Comparator<String> stringLengthComparator = sample::compareLength;
}
private int compareLength(String s1, String s2) {
return s1.length() - s2.length();
}
Stream API基础
stream是一个元素序列,它支持串行及并行的操作。
遍历列表
List<String> list = Arrays.asList("one", "two", "three", "four", "five", "six");
list.stream()
.forEach(s -> System.out.println(s));
过滤
Predicate<String> lowerThanOrEqualToFour = s -> s.length() <= 4;
Predicate<String> greaterThanOrEqualToThree = s -> s.length() >= 3;
list.stream()
.filter(lowerThanOrEqualToFour.and(greaterThanOrEqualToThree))
.forEach(s -> System.out.println(s));
排序
Predicate<String> lowerThanOrEqualToFour = s -> s.length() <= 4;
Predicate<String> greaterThanOrEqualToThree = s -> s.length() >= 3;
Comparator<String> byLastLetter = (s1, s2) -> s1.charAt(s1.length() - 1) - s2.charAt(s2.length() - 1);
Comparator<String> byLength = (s1, s2) -> s1.length() - s2.length();
list.stream()
.filter(lowerThanOrEqualToFour.and(greaterThanOrEqualToThree))
.sorted(byLastLetter.thenComparing(byLength))
.forEach(s -> System.out.println(s));
大小限制
Predicate<String> lowerThanOrEqualToFour = s -> s.length() <= 4;
Predicate<String> greaterThanOrEqualToThree = s -> s.length() >= 3;
Comparator<String> byLastLetter = (s1, s2) -> s1.charAt(s1.length() - 1) - s2.charAt(s2.length() - 1);
Comparator<String> byLength = (s1, s2) -> s1.length() - s2.length();
list.stream()
.filter(lowerThanOrEqualToFour.and(greaterThanOrEqualToThree))
.sorted(byLastLetter.thenComparing(byLength))
.limit(4)
.forEach(s -> System.out.println(s));
集合转化成列表
Predicate<String> lowerThanOrEqualToFour = s -> s.length() <= 4;
Predicate<String> greaterThanOrEqualToThree = s -> s.length() >= 3;
Comparator<String> byLastLetter = (s1, s2) -> s1.charAt(s1.length() - 1) - s2.charAt(s2.length() - 1);
Comparator<String> byLength = (s1, s2) -> s1.length() - s2.length();
List<String> result = list.stream()
.filter(lowerThanOrEqualToFour.and(greaterThanOrEqualToThree))
.sorted(byLastLetter.thenComparing(byLength))
.limit(4)
.collect(Collectors.toList());
并行处理
用它来遍历文件列表则再常见不过了:
public static void main(String[] args) {
File[] files = new File("c:/windows").listFiles();
Stream.of(files)
.parallel()
.forEach(Sample::process);
}
private static void process(File file) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
System.out.println("Processing -> " + file);
}
注意上面给出这个示例的同时,也暴露了并行处理的一些缺点。
Stream API进阶
映射
遍历文件后返回一个FileSize 对象:
class FileSize {
private final File file;
private final Long size;
FileSize(File file, Long size) {
this.file = file;
this.size = size;
}
File getFile() {
return file;
}
Long getSize() {
return size;
}
String getName() {
return getFile().getName();
}
String getFirstLetter() {
return getName().substring(0, 1);
}
@Override
public String toString() {
return Objects.toStringHelper(this)
.add("file", file)
.add("size", size)
.toString();
}
}
最终进行映射的代码:
File[] files = new File("c:/windows").listFiles();
List<FileSize> result = Stream.of(files)
.map(FileSize::new)
.collect(Collectors.toList());
分组:
按文件名的第一个字母将FileSize对象分组
Map<String, List<FileSize>> result = Stream.of(files)
.map(FileSize::new)
.collect(Collectors.groupingBy(FileSize::getFirstLetter));
Reduce
找出文件夹下的最大最小文件:
Optional<FileSize> filesize = Stream.of(files)
.map(FileSize::new)
.reduce((fs1, fs2) -> fs1.getSize() > fs2.getSize() ? fs1 : fs2);
如果你不需要FileSize对象,只需要一个数值的话:
OptionalLong max = Stream.of(files)
.map(FileSize::new)
.mapToLong(fs -> fs.getSize())
.max();
原创文章转载请注明出处:
http://it.deepinmind.com
英文原文链接
分享到:
相关推荐
### Java中的Filter(过滤器)使用详解 ...以上就是关于Java中Filter(过滤器)的一些基本概念和具体实现方式的详细介绍。通过合理的使用Filter,开发者可以轻松地实现许多强大的功能,提高应用程序的安全性和性能。
### JAVA_split_用法详解 在Java编程语言中,`String`类提供了多个实用的方法来处理字符串,其中`split()`方法是用于将一个字符串分割成字符串数组的一种常见方式。此方法利用正则表达式(Regular Expression)作为...
本压缩包文件"Java业务开发常见错误.zip"聚焦于Java开发中的一些常见陷阱,通过一系列文档帮助开发者理解和避免这些问题。 首先,"00丨开篇词丨业务代码真的会有这么多坑?.pdf"引出了一个核心问题,即业务代码的...
Java 类库是Java编程语言的核心组成部分,它包含了大量的预定义类和接口,这些类和接口提供了丰富的功能,方便开发者进行日常开发。Java类库主要分为若干个包,如`java.lang`、`java.util`、`java.io`等,每个包都有...
揽括了java中常见的关键字及用法,包括Abstract、instanceof、private、protected等等。
Java八股文是针对面试中常见Java编程问题的总结,主要关注Java 8的新特性和用法。在面试中,掌握这些知识不仅能展示你对语言的深入理解,也能体现出你的编程素养。Java 8作为Java的一个重要版本,引入了很多新功能,...
### Java中try-catch的用法详解 #### 一、基本概念 在Java编程语言中,`try-catch`结构是一种用于处理程序运行时可能出现的异常情况的重要机制。通过使用`try-catch`块,开发者可以更加精细地控制程序的行为,并...
在Java中处理日期和时间非常常见,而`java.util.Calendar`类则是进行此类操作的核心工具之一。`Calendar`类提供了一系列的功能来帮助开发者处理复杂的日期计算问题,比如日期的加减、获取特定日期组件等。 #### 二...
### Java里日期的用法汇总 #### 一、获取当前日期与时间 在Java中,获取当前日期与时间可以通过多种方式实现。以下是一些常用的方法: 1. **使用`Calendar`类**: - `Calendar`是Java中处理日期与时间的一个非常...
这份"java源代码,关于java中常见各种类的用法"的压缩包文件是学习Java基础知识的绝佳资源,尤其适合初学者。它包含了丰富的中文注解,帮助理解复杂的概念,使得学习过程更为直观和轻松。 首先,让我们深入探讨Java...
这份资源"Java常见笔试、面试题目深度剖析"显然是为了帮助求职者更好地准备相关考试而设计的。以下将对Java笔试和面试的一些核心知识点进行详细的阐述: 1. **基础语法**:Java的基础包括变量、数据类型、运算符、...
在java8中引入了Lambda表达式。其实,他就是一个匿名函数。我们经常会用到一些循环遍历,起始完全就可以通过Lambda来简化我们不必要的操作,下面我们来看一下Lambda常用的方法。
以上介绍了 Java 中的一些常见关键字及其用法。这些关键字是 Java 编程的基础,熟练掌握它们对于编写高效、可维护的 Java 应用程序至关重要。希望本文能帮助 Java 初学者更好地理解和使用这些关键字。
"javaList用法详解" Java 中的 List 用法是指在 Java 编程语言中使用 List 集合的方法和实现方式。List 集合是 Java 中的一种常用的集合类型,提供了许多实用的方法和实现类,下面将详细介绍 List 用法和实例。 ...
下面将根据这些常见的面试题目,详细解析一些重要的Java知识点。 1. **Java基础** - **变量和数据类型**:Java有基本数据类型(如int、char、float等)和引用数据类型(如类、接口和数组)。理解它们的区别和用法...
以下是对标题和描述中提及的Java枚举七种常见用法的详细说明: 1. 常量定义: 在Java中,枚举可以用来组织相关常量,提升代码的可读性和可维护性。例如,我们可以定义一个`Color`枚举,包含`RED`, `GREEN`, `BLANK`...
以上就是Java String类的一些基本操作和用法,理解并熟练运用这些知识点对于Java开发者来说非常重要,特别是在面试和实际项目开发中。通过深入学习和实践,您可以更好地处理字符串相关的各种问题。
以下是一些Java常见异常的详细解析: 1. **java.lang.NullPointerException**: 当尝试访问或操作一个未初始化的对象引用时,会抛出此异常。确保在使用对象之前已经正确地初始化它,避免对null值进行方法调用或...
Java 中的 this 和 super 的用法 Java 中的 this 和 super 是两个非常重要的关键字,它们都是用来访问对象的成员变量和方法的。下面我们将详细地讨论这两个关键字的用法和区别。 一、基础知识 1. super(参数):...
8. **接口的私有方法和静态方法**:Java 8允许接口定义私有方法和静态方法,增强了接口的功能,使其能够包含一些辅助方法。 9. **构造函数引用**:类似于方法引用,构造函数引用允许直接引用类的构造函数。例如,`...