简单约简
约简(reduction)是一种终结操作,将流约简为非流值。
看过一种简单的约简:count方法返回流中元素的数量。
还有max和min,返回最大值和最小值。
这些方法返回的都是Optional的值,英文意思:可选的,代码中指的是这个T可能为空,也可能不为空。
Optional提供了一种更加优雅和安全的方式来处理可能为null的值。
获得流中的最大值:
Optional largest = words.max(String::compareToIgnoreCase);
System.out.println("largest:"+largest.orElse(""));
获得非空集合的第一个值
Optional startsWithQ = words.filter(s->s.startsWith("Q")).findFirst();
只想知道是否存在匹配
boolean aWordStartsWithQ = words.prarllel().anyMatch(s->s.startsWith("Q"));
包括allMatch和noneMatch方法。
约简整体案例
java
package streams;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
import java.util.Optional;
public class Reduction {
public static void main(String[] args) throws IOException {
//Path相对路径是指JavaCore2
var contents = Files.readString(Path.of("./resources/alice.txt"));
List<String> words = List.of(contents.split("\\PL+"));
//max
Optional<String> largest = words.stream().max(String::compareToIgnoreCase);
System.out.println("largest: "+largest.orElse(""));
//findFirst
Optional<String> startsWithQ = words.stream().filter(s->s.startsWith("Q")).findFirst();
System.out.println("startsWithQ: "+startsWithQ.orElse(""));
//findAny
boolean aWordStartWithABC = words.parallelStream().anyMatch(s->s.startsWith("ABC"));
System.out.println("aWordStartWithABC: "+aWordStartWithABC);
//allMatch
boolean aWordStartWithABCallMatch = words.parallelStream().allMatch(s->s.startsWith("ABC"));
System.out.println("aWordStartWithABCallMatch: "+aWordStartWithABCallMatch);
//noneMatch
boolean aWordStartWithABCnoneMatch = words.parallelStream().noneMatch(s->s.startsWith("ABC"));
System.out.println("aWordStartWithABCnoneMatch: "+aWordStartWithABCnoneMatch);
}
}