方法引用
1 | PrintStream ps = System.out; |
类名::new
1 | class MathOperations { |
函数式接口
@FunctionalInterface 在接口上面注解声明,单例抽象方法接口,接口里面只能存在一个抽象方法
例如
1
2
3
4 @FunctionalInterface
interface myFunc{
public abstract void run();
}
1 | myFunc myFunc = () -> System.out.println("r"); |
java8中的Stream 流
stream流创建
1 | IntStream stream = Arrays.stream(arr); |
通过iterate创建stream流
1 | Stream<Integer> iterate = Stream.iterate(0, t -> t + 1).limit(10); |
这里不加limit会无限循环下去
generate与上面类似
1 | Stream.generate(Math::random).limit(10); |
Stream 的中间操作
filter():对元素进行过滤
1
2//过滤出大于5的数
iterate.filter(s -> s>5).forEach(System.out::println);distinct 对元素进行去重
当然,前提是要重写equals和hashcode方法
1 | iterate.distinct().forEach(System.out::println); |
- map 映射
这里通过map映射把int转换为string并进行输出
1 | iterate.map(e -> e.toString()).forEach(System.out::println); |
flatMap 一个或多个流合并成一个新流
1
2
3Stream.of(Arrays.asList(1, 2, 3), Arrays.asList(4, 5, 6)).flatMap(s -> s.stream()).forEach(s -> {
System.out.print(s + ", ");
});limit限流
1
Stream<Integer> iterate = Stream.iterate(0, t -> t + 1).limit(10);
skip 跳过元素
1
2
3
4Stream.of(Arrays.asList(1, 2, 3), Arrays.asList(4, 5, 6)).flatMap(s -> s.stream()).skip(3).forEach(s -> {
System.out.print(s + ", ");
});
//跳过前三个元素sorted 排序
1
2
3Stream.of(Arrays.asList(1, 2, 3), Arrays.asList(4, 5, 6)).flatMap(s -> s.stream()).sorted((e1,e2)->Integer.compare(e2,e1)).forEach(s -> {
System.out.print(s + ", ");
});peek 数据状态
1
2
3Stream.of(Arrays.asList(1, 2, 3), Arrays.asList(4, 5, 6)).flatMap(s -> s.stream()).peek(s -> System.out.println(s)).forEach(s -> {
System.out.print(s + ", ");
});
Stream 的终止操作
- forEach 循环操作 Stream 数据
- toArray——Stream 转数组
- anyMatch、allMatch、noneMatch 返回bool类型
- anyMatch(Predicate p) 检查是否至少匹配一个元素。
- allMatch(Predicate p) 检查是否匹配的所有元素。
- noneMatch(Predicate p) 检查是否没有匹配的元素。
1
System.out.println(iterate.allMatch(s -> s > -1)); //检查是否所有值大于-1
min、max、count
min(Comparator p) 返回流中最小值。 max(Comparator c) 返回流中最大值。count 返回流中元素个数。1
System.out.println(iterate.max((e1,e2)-> Integer.compare(e1,e2)));
reduce 统计
将流中元素反复集合起来,得到一个值1
System.out.println(iterate.reduce(Integer::sum));
collect——list、set、map
joining()、groupingBy
1
2String collect = list.stream().collect(Collectors.joining("->","",""));
System.out.println(collect);findFirst、findAny
1
2findFirst():获取第一个元素
findAny():获取任一元素
串行流与并行流
串行流上的操作是在一个线程中依次完成,而并行流则是在多个线程上同时执行。
串行流
1 | int count = (int) ((Stream) list.stream().sequential()).sorted().count(); |
并行流
1 | int count = (int)((Stream) list.stream().parallel()).sorted().count(); |
Optional取代空指针
1 | Optional.of(T t):创建一个 Optional 实例 |
isPresent()判断容器中是否包含对象
T get() 获取容器中的对象,没有则抛出异常
T orElse(T other):返回值(如果存在),否则返回其他
T orElseGet(Supplier<? extends T> other):返回值(如果存在),否则调用其他并返回该调用的结果。