Java8 第四章
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java8 第四章相关的知识,希望对你有一定的参考价值。
流操作可以顺序执行也可以并行执行why.???
流
--Java API新成员==>遍历数据集的高级迭代器
--特点:透明并行处理,无需写多线程代码
--因为filter、sorted、map和collect等操作是与具体线程模型无关的高层次构件,所以 它们的内部实现可以是单线程的,也可能透明地充分利用你的多核架构! ==>书中这句话不理解,解释的很含糊!
//菜属性
public class Dish {
private final String name;
private final boolean vegetarian;
private final int calories;
private final Type type;
?
public Dish(String name, boolean vegetarian, int calories, Type type) {
this.name = name;
this.vegetarian = vegetarian;
this.calories = calories;
this.type = type;
}
...getset...
@Override
public String toString() {
return name;
}
public enum Type { MEAT, FISH, OTHER }
}
public class Stream {
public static void main(String[] args) {
//菜单
List<Dish> menu = Arrays.asList(
new Dish("pork", false, 800, Dish.Type.MEAT),
new Dish("beef", false, 700, Dish.Type.MEAT),
new Dish("chicken", false, 400, Dish.Type.MEAT),
new Dish("french fries", true, 530, Dish.Type.OTHER),
new Dish("rice", true, 350, Dish.Type.OTHER),
new Dish("season fruit", true, 120, Dish.Type.OTHER),
new Dish("pizza", true, 550, Dish.Type.OTHER),
new Dish("prawns", false, 300, Dish.Type.FISH),
new Dish("salmon", false, 450, Dish.Type.FISH));
?
List<String> threeHighCaloricDishNames = menu //数据源
.stream() //建立操作流水线
.filter(x -> x.getCalories() > 300) //取出热量最高的
.map(Dish::getName) //获取菜名
.limit(3) //选择头三个
.collect(Collectors.toList()); //结果存在另一个List里面
System.out.println(threeHighCaloricDishNames);
}
}
map——接受一个Lambda,将元素转换成其他形式或提取信息
collect——将流转换为其他形式
流和集合的区别
--简单理解 ==> 区别就在计算的时间
--集合 ==> 集合是一个内存中的数据结构, 它包含数据结构中目前所有的值——集合中的每个元素都得先算出来才能添加到集合中。(你可 以往集合里加东西或者删东西,但是不管什么时候,集合中的每个元素都是放在内存里的,元素 都得先算出来才能成为集合的一部分。
--流 ==> 流则是在概念上固定的数据结构(你不能添加或删除元素),其元素则是按需计算的,从另一个角度来说,流就 像是一个延迟创建的集合:只有在消费者要求的时候才会计算值(用管理学的话说这就是需求驱 动,甚至是实时制造).
--举个例子 ==> 集合就像你用dvd光盘看电影,而流则是用在线流媒体看电影(eg:爱奇艺网站上看)
--流只能遍历一次
流操作
终端操作:关闭流的操作
中间操作:连接起来流的操作
List<String> names = menu
.stream()
.filter(x -> {
System.out.println("filter"+x);
return x.getCalories() > 300;
})
.map(x->{
System.out.println("map"+x.getName());
return x.getName();
})
.limit(3)
.collect(Collectors.toList());
System.out.println(threeHighCaloricDishNames);
输出:
filterpork
mappork
filterbeef
mapbeef
filterchicken
mapchicken
[pork, beef, chicken]
?
filter和map是两个独立的操作,但他们合并到同一次遍历中===>循环合并技术
以上是关于Java8 第四章的主要内容,如果未能解决你的问题,请参考以下文章
一起Talk Android吧(第四百三十四回:Java8中的时区类)
一起Talk Android吧(第四百三十七回:Java8中的日期时间类总结)
一起Talk Android吧(第四百三十一回:Java8中的日期类)
一起Talk Android吧(第四百三十二回:Java8中的时间类)