一、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. vue.js(5)--事件修饰符

    vue中的事件修饰符(.stop..prevent..self..capture..once) (1)实例代码 <!DOCTYPE html> <html lang="en ...

  2. ConstantUtils

    public class ConstantUtils { public static final Integer PAGE_SIZE=2; public static final Integer NA ...

  3. 生产服务器上安装Python

    2018-05-17 生产环境的服务器(以下简称内网服务器)由于安全限制,可能无法连接外网.这种情况下将无法直接使用pip命令安装python的包 一.更改pip源 - 默认pip是使用Python官 ...

  4. 引用vector里的元素被删除后,引用会怎么样?

    引用的定义不多说,直接看做变量的别名就可以了.有一天写着写着代码,突然想到,如果对vector里某个元素设置引用后,将这个元素从vector里删除会怎么样?我思考了下,认为那个元素会被删除,但是引用还 ...

  5. JSONP 跨域请求原理

    0x00 简介 由于浏览器的同源策略,我们想要从别的域获取数据变得困难,需要特殊的技术才能获取 0x01 使用 客户域:client.com 服务器(他域):server.com 如客户想访问 : h ...

  6. [uboot] (第三章)uboot流程——uboot-spl代码流程(转)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/ooonebook/article/det ...

  7. iOS给UIView添加点击事件

    我要给一个UIView对象topView添加点击事件,方法如下: 步骤1:创建手势响应函数 (void)event:(UITapGestureRecognizer *)gesture { //处理事件 ...

  8. CMDB架构需求实现

    CMDB资产管理部分实现 需求 1.存储所有IT资产信息 2.数据可手动添加 3.硬件信息可自动收集 4.硬件信息可自动变更 5.可对其他系统灵活开放API 6.API接口安全认证 立业之本:定义表结 ...

  9. 【crontab】误删crontab及其恢复

    中秋节快到了,首先祝自己中秋快乐. 昨天下午六点,心里正想着加完一个crontab就可以下班了.本来想执行 crontab -e的,没想到手一抖就输入了crontab ,然后就进入了下面这个样子.

  10. 【转】毛虫算法——尺取法

    转自http://www.myexception.cn/program/1839999.html 妹子满分~~~~ 毛毛虫算法--尺取法 有这么一类问题,需要在给的一组数据中找到不大于某一个上限的&q ...