Stream介绍
一、Stream介绍
现在有这样的需求:有个菜单list,菜单里面非常多的食物列表,只选取小于400卡路里的并且按照卡路里排序,然后只想知道对应的食物名字。
代码:
package com.cy.java8;
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;
}
public String getName() {
return name;
}
public boolean isVegetarian() {
return vegetarian;
}
public int getCalories() {
return calories;
}
public Type getType() {
return type;
}
public enum Type {MEAT, FISH, OTHER}
@Override
public String toString() {
return "Dish{" +
"name='" + name + '\'' +
", vegetarian=" + vegetarian +
", calories=" + calories +
", type=" + type +
'}';
}
}
package com.cy.java8; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors; public class SimpleStream { public static void main(String[] args) {
//have a dish list (menu)
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> lowerCaloriesDish = getLowerCaloriesDish(menu);
System.out.println(lowerCaloriesDish); List<String> lowerCaloriesDish2 = getLowerCaloriesDish2(menu);
System.out.println(lowerCaloriesDish2);
} /**
* 用Stream的方式去写
*/
private static List<String> getLowerCaloriesDish2(List<Dish> menu){
return menu.stream().filter(dish -> dish.getCalories() < 400)
.sorted(Comparator.comparing(d->d.getCalories()))
.map(Dish::getName)
.collect(Collectors.toList());
} /**
* 以前的写法
* 获取卡路里小于400的食物列表,并且排好序,只返回食物的名字;
* @param menu
* @return
*/
private static List<String> getLowerCaloriesDish(List<Dish> menu){
List<Dish> lowerCalories = new ArrayList<>();
//filter and get calories less 400
for(Dish dish : menu){
if(dish.getCalories() < 400 ){
lowerCalories.add(dish);
}
}
//sort
lowerCalories.sort((o1, o2) -> o1.getCalories() - o2.getCalories()); List<String> lowerCaloreisDishList = new ArrayList<>();
for(Dish dish : lowerCalories){
lowerCaloreisDishList.add(dish.getName());
}
return lowerCaloreisDishList;
}
}
console打印:
[season fruit, prawns, rice]
[season fruit, prawns, rice]
Stream:升级版的api,处理集合等等,有个好处是可以并行处理,而且不需要关心并行处理的细节,
二、Stream的简单用法介绍
围绕着stream的一些方法进行一些代码的举例:
package com.cy.java8; import java.util.*;
import java.util.stream.Stream; public class SimpleStream { public static void main(String[] args) {
//have a dish list (menu)
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)); System.out.println("method1 the max calories dish is: " + getMaxCaloriesDish(menu));
System.out.println("method2 the max calories dish is: " + getMaxCaloriesDish2(menu));
System.out.println("have dish calories larger than 600: " + foundDishCaloriesLarger600(menu));
System.out.println("all dish calories larger than 400: " + allDishCaloriesLarger400(menu));
System.out.println("---------------------------------------"); /**
* 创建一个stream
*/
Stream<Dish> stream = Stream.of(new Dish("prawns", false, 300, Dish.Type.FISH),
new Dish("salmon", false, 450, Dish.Type.FISH));
stream.forEach(System.out::println);
} /**
* 找出热量最大的食物名字
*/
private static String getMaxCaloriesDish(List<Dish> menu){
return menu.stream().max(Comparator.comparingInt(Dish::getCalories)).get().getName();
} /**
* 找出热量最大的食物,方法二
*/
private static String getMaxCaloriesDish2(List<Dish> menu){
Optional<Dish> maxDish = menu.stream().sorted((d1, d2) -> d2.getCalories() - d1.getCalories()).findFirst();
return maxDish.get().getName();
} /**
* 菜单里面是否有食物热量大于600
*/
private static boolean foundDishCaloriesLarger600(List<Dish> menu){
boolean result = menu.stream().anyMatch(dish -> dish.getCalories() > 600);
return result;
} /**
* 菜单里面食物的热量是否都大于400
*/
private static boolean allDishCaloriesLarger400(List<Dish> menu){
boolean result = menu.stream().allMatch(dish -> dish.getCalories() > 400);
return result;
}
}
打印结果:
method1 the max calories dish is: pork
method2 the max calories dish is: pork
have dish calories larger than 600: true
all dish calories larger than 400: false
---------------------------------------
Dish{name='prawns', vegetarian=false, calories=300, type=FISH}
Dish{name='salmon', vegetarian=false, calories=450, type=FISH}
--
Stream介绍的更多相关文章
- java8学习之Stream介绍与操作方式详解
关于默认方法[default method]的思考: 在上一次[http://www.cnblogs.com/webor2006/p/8259057.html]中对接口的默认方法进行了学习,那在Jav ...
- Java 8 Stream介绍及使用1
(原) stream的内容比较多,先简单看一下它的说明: A sequence of elements supporting sequential and parallel aggregate * o ...
- Spring Cloud Stream介绍-Spring Cloud学习第八天(非原创)
文章大纲 一.什么是Spring Cloud Stream二.Spring Cloud Stream使用介绍三.Spring Cloud Stream使用细节四.参考文章 一.什么是Spring Cl ...
- Java 8 Stream介绍及使用2
(原) stream中另一些比较常用的方法. 1. public static<T> Stream<T> generate(Supplier<T> s) 通过gen ...
- java之stream(jdk8)
一.stream介绍 参考: Java 8 中的 Streams API 详解 Package java.util.stream Java8初体验(二)Stream语法详解 二.例子 im ...
- .NET Core/.NET之Stream简介
之前写了一篇C#装饰模式的文章提到了.NET Core的Stream, 所以这里尽量把Stream介绍全点. (都是书上的内容) .NET Core/.NET的Streams 首先需要知道, Syst ...
- Java进阶篇之十五 ----- JDK1.8的Lambda、Stream和日期的使用详解(很详细)
前言 本篇主要讲述是Java中JDK1.8的一些新语法特性使用,主要是Lambda.Stream和LocalDate日期的一些使用讲解. Lambda Lambda介绍 Lambda 表达式(lamb ...
- java8 Stream常用方法和特性浅析
有一个需求,每次需要将几万条数据从数据库中取出,并根据某些规则,逐条进行业务处理,原本准备批量进行for循环或者使用存储过程,但是for循环对于几万条数据来说效率较低:存储过程因为逻辑非常复杂,写起来 ...
- 完美数据迁移-MongoDB Stream的应用
目录 一.背景介绍 二.常见方案 1. 停机迁移 2. 业务双写 3. 增量迁移 三.Change Stream 介绍 监听的目标 变更事件 四.实现增量迁移 五.后续优化 小结 附参考文档 一.背景 ...
随机推荐
- openlayers 添加标记点击弹窗 定位图标闪烁
环境vue3.0 ,地图为公用组件,将添加图标标记的方法放在公共地图的初始化方法里 同一时间弹窗和定位标识都只有一个,因而我把弹窗和定位标记的dom预先写好放到了页面 //矢量标注样式设置函数,设置i ...
- [Linux]Linux下经常会用到的简单实例(持续更新)
1.查找某些进程并结束他们: ps -elf | grep '进程关键字' | awk '{print $4}'| xargs kill -9 解析: ps -elf 的 -e 代表列出所有进程,-l ...
- 【Java】 Java反射机制总结
一.什么是反射 在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性(包括私有的方法和属性),这种动态获取的信息以及动态调用对象的方法的 ...
- linux vps定时备份网站、数据库命令sh
vps定时备份数据库命令,将下面的代码保存为backsql.sh,然后设置定时任务运行即可. cd /home/admin/backup #切换到备份目录 btimes=$(date +%y%m%d% ...
- 新建ext4分区及开机挂载
1.查看新的20G硬盘是否已经挂在完毕. 2.使用fdisk命令创建主分区 3.再将分区设置完毕之后,查看磁盘分区是否创建完成. 2.使用mkfs.ext4命令将新创建的分区进行格式化为: 1)blo ...
- js时间转时间戳
转换成时间戳 new Date('2018-10-11 14:28:47'.replace(/-/g, '/')).getTime() //1539239327000
- java数据结构1--数组、排序和Arrays工具类
数组:Array 数组的定义 数组的内存结构 数组定义常见问题 数组常见操作 Java参数传递问题--值传递 二维数组 1.数组概念 同一种类型数据的集合,可以是基本数据类型,也可以是引用数据类型. ...
- 【GDOI2017模拟12.9】最近公共祖先
题目 分析 首先,将这些节点按dfs序建一棵线段树. 因为按dfs序,所以在同一子树上的节点会放在线段树相邻的位置. 发现,对于一个位置x,它的权值只会对以x为根的子树造成影响. 当修改x时,用w[x ...
- Fortran代码生成so库
例: ifort -c -fpic test.f90ifort -shared -o test.so test.o
- shiro框架学习-8-shiro缓存
1. shiro进行认证授权时会查询数据库获取用户角色权限信息,每次登录都会去查询,这样对性能会又影响.可以设置缓存,查询时先去缓存中查找,缓存中没有再去数据库查询. 从shiro的架构图中可以看到有 ...