Java8实战 阅读笔记
来源:互联网 发布:php输出js代码 编辑:程序博客网 时间:2024/05/18 08:03
lambda
组成
Comparator<Apple> byWeight =(Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight());Lambda表达式由参数、箭头和主体组成
示例
使用案例 Lambda示例布尔表达式 (List<String> list) -> list.isEmpty()创建对象 () -> new Apple(10)消费一个对象 (Apple a) -> { System.out.println(a.getWeight()); }从一个对象中选择/抽取 (String s) -> s.length()组合两个值 (int a, int b) -> a * b比较两个对象 (Apple a1, Apple a2) ->a1.getWeight().compareTo(a2.getWeight())
常用的函数式接口
函数式接口 函数描述符Predicate<T> T->booleanConsumer<T> T->voidFunction<T,R> T->RSupplier<T> ()->TUnaryOperator<T> T->TBinaryOperator<T> (T,T)->TBiPredicate<L,R> (L,R)->boolean BiConsumer<T,U> (T,U)->voidBiFunction<T,U,R> (T,U)->R
Lambdas及函数式接口的例子
布尔表达式(List<String> list) -> list.isEmpty() Predicate<List<String>>创建对象() -> new Apple(10) Supplier<Apple>消费一个对象(Apple a) ->System.out.println(a.getWeight()) Consumer<Apple>从一个对象中选择/提取(String s) -> s.length() Function<String, Integer> 或ToIntFunction<String>合并两个值(int a, int b) -> a * b IntBinaryOperator比较两个对象(Apple a1, Apple a2) ->a1.getWeight().compareTo(a2.getWeight()) Comparator<Apple> 或BiFunction<Apple, Apple, Integer>或 ToIntBiFunction<Apple, Apple>
流
1.流简介
List<String> names=munu.stream() //集合流 .filter(d->d.getCalories()>300) //筛选热量大于300的 .map(d->d.getName()) //提取菜单的名字 .limit(3) //取前3个 .collect(toList()); //将流转换为List
2.中间操作
filter 中间 T->booleanmap 中间 T->Rlimit 中间 取流前n个元素,是否有序取决于所取流是否有序 skip 中间 返回一个扔掉前n个元素的流;如果流中元素不足n个,则返回一个空流 sorted 中间 (T,T)->intdistinct 中间 去重flatMap 中间 把流中的每个值都换成另一个流,然后把所有的流连接起来成为一个流forEach 终端 消费流中的每个元素并对其应用Lanbda。这一操作返回voidcount 终端 返回流中元素的个数。这一操作返回longcollect 终端 把流归约成一个集合,比如List、Map甚至是IntegerallMatch 终端 T->booleananyMatch 终端 T->booleannoneMatch 终端 T->booleanfindFirst 终端 T->OptionnalfindAny 终端 T->Optionnalreduce 终端 (T,T)->T
3.构建流
由值创建流
Stream.of(“123”,”456”);
由数组创建流
Arrays.stream(…);
由文件生成流
long uniqueWords = 0;
try(
Stream lines =Files.lines(Paths.get(“data.txt”),Charset.defaultCharset())){
uniqueWords = lines.flatMap(line -> Arrays.stream(line.split(” “)))
.distinct()
.count();
}catch(IOException e){
}由函数生成流:创造无限流
Stream API提供了两个静态方法来从函数生成流: Stream.iterate 和 Stream.generate 。
iterate 方法接受一个初始值(在这里是 0 ),还有一个依次应用在每个产生的新值上的Lambda
Stream.iterate(0, n -> n + 2)
.limit(10)
.forEach(System.out::println);与 iterate 方法类似, generate 方法也可让你按需生成一个无限流
Stream.generate(Math::random)
.limit(5)
.forEach(System.out::println);
用流收集数据
- 分组:…collect(groupingBy(…))
- 计数:…collect(counting()) 或 menu.stream().count();
- 最大值和最小值:…collect(maxBy(…))和…collect(minBy(…))
- 汇总:…collect(summingInt())
- 求和:…collect(averagingInt())
- 连接字符串:…collect(joining())
- 分区:…collect(partitioningBy(…))
并行数据处理与性能
调用 parallel 方法将顺序流转换为并行流
public static long parallelSum(long n) {
return Stream.iterate(1L, i -> i + 1)
.limit(n)
.parallel()
.reduce(0L, Long::sum);
}并行与顺序间切换
stream.parallel()
.filter(…)
.sequential()
.map(…)
.parallel()
.reduce();正确使用并行流
- 留意装箱
- 有些操作本身在并行流上的性能就比顺序流差。特别是 limit 和 findFirst 等依赖于元素顺序的操作,它们在并行流上执行的代价非常大。
- 对于较小的数据量,选择并行流几乎从来都不是一个好的决定
- 要考虑流背后的数据结构是否易于分解。例如, ArrayList 的拆分效率比 LinkedList高得多,因为前者用不着遍历就可以平均拆分,而后者则必须遍历。
- 流自身的特点
默认方法
对库开发者重要,接口中新增方法,提供默认实现。之前实现了该接口的用户 不用修改 实现了该接口的类,以便接口可平滑过渡。为避免冲突,有同名方法,它会优先使用类内方法,然后是更具体的接口默认方法,或者显式调用
- Java8实战 阅读笔记
- JAVA8 linkedhashmap 源码阅读笔记
- JAVA8 hashmap源码阅读笔记(红黑树链表)
- CSS实战笔记 阅读笔记
- Lucene实战阅读笔记1
- 阅读Netty实战(精髓)笔记
- <JAVA8实战>学习笔记1-流与集合的区别
- <JAVA8实战>学习笔记2-数据处理好工具Stream
- java8 ArrayList源码阅读
- java8 LinkedList源码阅读
- java8 ArrayList源码阅读
- java8 LinkedList源码阅读
- java8 ArrayList源码阅读
- Linux C 编程实战--阅读笔记
- LINQ实战阅读笔记--第一章LINQ简介
- 《Hadoop实战》第一部分阅读笔记
- 《Maven实战》阅读笔记整理(一)
- 《Maven实战》阅读笔记整理(二)
- iSCSI技术
- memcached telnet命令
- Redis 入门详解
- ARM汇编指令
- java虚拟机的生命周期
- Java8实战 阅读笔记
- Margin负边距使用之双飞翼布局
- 数据结构之栈(附:Stack/Vector源码分析)
- 史上最全的maven pom.xml文件教程详解
- QSettings介绍
- 说说was的端口
- 判断链表回文
- 双连通分量模板以及对一些不好理解点的解释
- 数据库简单sql语句小总