Java8流的使用
中间
:一个中间操作链,形成一条流的流水线
终端
:执行流水线,并能生成结果
操作 | 类型 | 返回类型 | 使用的类型/函数式接口 | 函数描述符 |
---|---|---|---|---|
filter | 中间 | Stream | Predicate | T -> boolean |
distinct | 中间 | Stream | ||
skip | 中间 | Stream | long | |
limit | 中间 | Stream | long | |
map | 中间 | Stream | Function<T, R> | T -> R |
flatMap | 中间 | Stream | Function<T, Stream> | T -> Stream |
sorted | 中间 | Stream | Comparator | (T, T) -> int |
anyMatch | 终端 | boolean | Predicate | T -> boolean |
noneMatch | 终端 | boolean | Predicate | T -> boolean |
allMatch | 终端 | boolean | Predicate | T -> boolean |
findAny | 终端 | Optional | ||
findFirst | 终端 | Optional | ||
forEach | 终端 | void | Consumer | T -> void |
collect | 终端 | R | Collector<T, A, R> | T -> |
reduce | 终端 | Optional | BinaryOperator | (T, T) -> T |
count | 终端 | long |
中间操作
filter的使用
//筛选出以J开头的元素并打印
Arrays.asList("Java", "JavaScript", "python", "PHP", "C#", "Golang", "Swift")
.stream().filter(s -> s.startsWith("J"))
.forEach(System.out::println);
//输出结果: Java JavaScript
distinct的使用
//剔除掉重复的元素
Arrays.asList(1,2,1,3,2,5)
.stream().distinct()
.forEach(System.out::println);
//输出结果: 1 2 3 5
skip的使用
//跳过第一个元素
Arrays.asList(1,2,1,3,2,5)
.stream().skip(1)
.forEach(System.out::println);
//输出结果: 2 1 3 2 5
limit的使用
//截取集合前面n个元素,如果n大于集合的size,则返回全部元素 如果 n < 0 抛异常 IllegalArgumentException
Arrays.asList(1,2,1,3,2,5)
.stream().limit(10)
.forEach(System.out::println);
}
//输出结果: 1 2 1
map的使用
//将数组中的元素全部转为大写
Arrays.asList("Java", "JavaScript", "python", "PHP", "C#", "Golang", "Swift")
.stream().map(String::toUpperCase)
.forEach(System.out::println);
}
//输出结果: JAVA JAVASCRIPT PYTHON PHP C# GOLANG SWIFT
//将流转换成特定的流
Integer sum = Arrays.asList(1,2,1,3,2,5)
.stream().mapToInt(value -> value).sum();
//输出结果: 14
flatMap的使用
List<String []> objLlist = Stream.of("Hello","World")
.map(word ->word.split(""))
.distinct()
.collect(Collectors.toList());
//输出结果 [Ljava.lang.String;@43556938 [Ljava.lang.String;@3d04a311
List strList = Stream.of("Hello","World")
.map(word ->word.split(""))
.flatMap(Arrays::stream)
.distinct()
.collect(Collectors.toList());
//输出结果 H e l o W r d
终端操作
数组和集合的遍历
//遍历集合并打印
Arrays.asList("Java", "JavaScript", "python", "PHP", "C#", "Golang", "Swift")
.forEach(System.out::println);
//输出结果 Java JavaScript python PHP C# Golang Swift
anyMatch的使用
//判断集合中的元素是否至少有一个满足某个条件
boolean flag = Arrays.asList(1,2,1,3,2,5)
.stream().allMatch(s -> s > 3);
//输出结果: true
noneMatch的使用
//判断集合中的元素是否都不满足某个条件
boolean flag = Arrays.asList(1,2,1,3,2,5)
.stream().noneMatch(s -> s > 3);
//输出结果: false
allMatch的使用
//判断集合中的元素是否都满足某个条件
boolean flag = Arrays.asList(1,2,1,3,2,5)
.stream().allMatch(s -> s > 0);
//输出结果: true
findAny的使用
//判断集合中的元素是否都满足某个条件,有则打印一个元素
Arrays.asList(1,2,1,3,2,5)
.stream().filter(s -> s > 2)
.findAny()
.ifPresent(System.out::println);
//输出结果: 3
//判断集合中的元素是否都满足某个条件
boolean flag = Arrays.asList(1,2,1,3,2,5)
.stream()
.filter(s -> s > 3)
.findAny()
.isPresent();
//输出结果: true
findFirst的使用
//判断集合中的元素是否都满足某个条件,有则打印第一符合的个元素
Arrays.asList(1,2,1,3,2,5)
.stream().filter(s -> s > 2)
.findFirst()
.ifPresent(System.out::println);
//输出结果: 3
collect的使用
//将集合中筛选出符合条件的并放入集合中返回
List<String> list =
Arrays.asList("Java", "JavaScript", "python", "PHP", "C#", "Golang", "Swift")
.stream()
.filter(s -> s.startsWith("J"))
.collect(Collectors.toList());
//输出结果: Java JavaScript
reduce的使用
//对numbers中的元素求和
Arrays.asList(1, 2, 1, 3, 3, 2, 4)
.stream()
.reduce(0, Integer::sum); // 16
//求集合中的最大值
Arrays.asList(1,2,1,3,2,5)
.stream()
.reduce(Integer::max)
.ifPresent(System.out::println);
//输出结果: 5
count的使用
//将集合中筛选出符合条件的并返回符合条件的个数
Long count =
Arrays.asList("Java", "JavaScript", "python", "PHP", "C#", "Golang", "Swift")
.stream()
.filter(s -> s.startsWith("J"))
.count();
//输出结果: 2