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 介绍 监听的目标 变更事件 四.实现增量迁移 五.后续优化 小结 附参考文档 一.背景 ...
随机推荐
- Xshell6,亲测可用~破解版简单解压免安装~已更新官方版本安装方法
下面的内容别看了,使用这个最新的安装官方版本 https://www.cnblogs.com/taopanfeng/p/11671727.html 下面的内容别看了,使用这个最新的安装官方版本 htt ...
- 32-第3章 数据链路层--抓包分析数据帧格式-ISO一图了然-小结
OSI理论模型 层级 名称 事物举例 功能 数据单位 别名 数据组成 协议举例 7 应用层 QQ.OA 网络通信 上层数据 上层数据 HTTP/FTP/DNS 6 表示层 web数据压缩.https加 ...
- String,StringBuilder和StringBuffer
String 字符串常量,由String创建的字符内容,长度是不可改变,存放字符的数组被声明为final. 实际上String类操作字符串是通过建立一个StringBuffer,然后调用append( ...
- nodejs fs copy本地文件src dst
1. // fs.writeFileSync(pathNewFile, fs.readFileSync(fileName)); 2. fs.createReadStream(fileName).p ...
- 用python实现js语言里的特性
有大佬说:“搜 arraybuffer 的 polyfill 然后翻译成 python就行了” ...
- laravel中间件失效,配置文件重新加载
composer dump-autoload php artisan cache:clear 清理视图缓存 php atisan view:clear 清除运行缓存 php artisan cache ...
- Vasya And The Matrix CodeForces - 1016D (思维+构造)
Now Vasya is taking an exam in mathematics. In order to get a good mark, Vasya needs to guess the ma ...
- Windows10家庭版的功能中没有Hyper-V的解决方法
1.在桌面新建记事本 将下面的内容复制到编辑器或者记事本当中 pushd "%~dp0" dir /b %SystemRoot%\servicing\Packages\*Hyper ...
- 【串线篇】SpringBoot数据访问【数据源/mybatis/指定映射文件位置】
一.配置数据源 1.1.jdbc版本 JDBC(.tomcat.jdbc.pool.DataSource作为数据源) <?xml version="1.0" encoding ...
- java 各版本新特性
Java 5,6,7,8,9,10,11新特性吐血总结 lkd_whh关注赞赏支持 12018.04.01 14:09:15字数 1,948阅读 10,615 作者:拔剑少年 简书地址:https:/ ...