一、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介绍的更多相关文章

  1. java8学习之Stream介绍与操作方式详解

    关于默认方法[default method]的思考: 在上一次[http://www.cnblogs.com/webor2006/p/8259057.html]中对接口的默认方法进行了学习,那在Jav ...

  2. Java 8 Stream介绍及使用1

    (原) stream的内容比较多,先简单看一下它的说明: A sequence of elements supporting sequential and parallel aggregate * o ...

  3. Spring Cloud Stream介绍-Spring Cloud学习第八天(非原创)

    文章大纲 一.什么是Spring Cloud Stream二.Spring Cloud Stream使用介绍三.Spring Cloud Stream使用细节四.参考文章 一.什么是Spring Cl ...

  4. Java 8 Stream介绍及使用2

    (原) stream中另一些比较常用的方法. 1. public static<T> Stream<T> generate(Supplier<T> s) 通过gen ...

  5. java之stream(jdk8)

    一.stream介绍 参考: Java 8 中的 Streams API 详解   Package java.util.stream   Java8初体验(二)Stream语法详解   二.例子 im ...

  6. .NET Core/.NET之Stream简介

    之前写了一篇C#装饰模式的文章提到了.NET Core的Stream, 所以这里尽量把Stream介绍全点. (都是书上的内容) .NET Core/.NET的Streams 首先需要知道, Syst ...

  7. Java进阶篇之十五 ----- JDK1.8的Lambda、Stream和日期的使用详解(很详细)

    前言 本篇主要讲述是Java中JDK1.8的一些新语法特性使用,主要是Lambda.Stream和LocalDate日期的一些使用讲解. Lambda Lambda介绍 Lambda 表达式(lamb ...

  8. java8 Stream常用方法和特性浅析

    有一个需求,每次需要将几万条数据从数据库中取出,并根据某些规则,逐条进行业务处理,原本准备批量进行for循环或者使用存储过程,但是for循环对于几万条数据来说效率较低:存储过程因为逻辑非常复杂,写起来 ...

  9. 完美数据迁移-MongoDB Stream的应用

    目录 一.背景介绍 二.常见方案 1. 停机迁移 2. 业务双写 3. 增量迁移 三.Change Stream 介绍 监听的目标 变更事件 四.实现增量迁移 五.后续优化 小结 附参考文档 一.背景 ...

随机推荐

  1. 2019-11-29-win10-uwp-轻量级-MVVM-框架入门-2.1.5.3199

    title author date CreateTime categories win10 uwp 轻量级 MVVM 框架入门 2.1.5.3199 lindexi 2019-11-29 10:16: ...

  2. 简单Delphi程序设计

  3. iconv - 字符集转换

    总览 (SYNOPSIS) iconv [-f encoding] [-t encoding] [inputfile ...] 描述 (DESCRIPTION) iconv 程序 把 文本 从 一种 ...

  4. RHEL6查看运行级别和grub加密阻止进入单用户模式

    1.查看当前运行级别 [root@cluster01 ~]# cat /etc/redhat-release Red Hat Enterprise Linux Server release 6.5 ( ...

  5. VM错误解决:This Virtual Machine Appears To Be In Use

    刚才准备做网站(数据备份都在VM里面),没想到启动不起来,咋一看,出现This Virtual Machine Appears To Be In Use字号,不过貌似我没有启动任何VM啊,何来in u ...

  6. (转)JAVA socket 进行十六进制报文交互测试

    import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io. ...

  7. C Make a Square Educational Codeforces Round 42 (Rated for Div. 2) (暴力枚举,字符串匹配)

    C. Make a Square time limit per test2 seconds memory limit per test256 megabytes inputstandard input ...

  8. visual studio密钥

    企业版:NJVYC-BMHX2-G77MM-4XJMR-6Q8QF 专业版:KBJFW-NXHK6-W4WJM-CRMQB-G3CDH

  9. 洛谷P3374 【模板】树状数组 1&&P3368 【模板】树状数组 2题解

    图片来自度娘~~ 树状数组形如上图,是一种快速查找区间和,快速修改的一种数据结构,一个查询和修改复杂度都为log(n),树状数组1和树状数组2都是板子题,在这里进行详解: 求和: 首先我们看一看这个图 ...

  10. [易学易懂系列|rustlang语言|零基础|快速入门|(3)|所有权Ownership]

    今天我们来讲讲rust最难,也是最重要的概念: Ownership,Borrowing,Lifetimes 首先我们来看看:ownership(所有权) 我们来看看下面的代码: let a = [1, ...