三.查找和匹配
处理思路:看数据集中的某些元素是否匹配一个给定的元素
Stream API通过allMatch、anyMatch、noneMatch、findFirst和findAny方法提供了这样的工具。
1.检查谓词是否至少匹配一个元素
anyMatch():流中是否有一个元素能匹配给定的谓词
需求:看菜单里面是否有素食可供选择
if(menu.stream.anyMatch(Dish::isVegetarian)){

anyMatch()返回一个boolean
2.检查谓词是否匹配所有元素
需求:看看菜品是否有利健康(即所有的量都于1000里)
boolean isHealthy = menu.stream().allMatch(d -> d.getCalories() < 1000); 
noneMatch():流中没有任何元素与给定的谓词匹配
boolean isHealthy = menu.stream().noneMatch(d -> d.getCalories() >= 1000); 
3.查找元素
findAny():返回当前流中的任意元素
需求:从菜品中找到一道素食菜肴
Optional<Dish> dish = menu.stream().filter(Dish::isVegetarian).findAny(); 
4.查找第一个元素
findFirst()
需求:给定一个数字列表,找出第一个平方能被3整除的数
List<Integer> someNumbers = Arrays.asList(1, 2, 3, 4, 5); 
Optional<Integer> firstSquareDivisibleByThree = someNumbers.stream().map(x->x*x).filter(x->x%3==0).findFirst();

四、归约
处理思路:把一个流中的元素组合起来,使用reduce()
1.元素求和
int sum=numbers.stream().reduce(0,(a,b)->a+b);
redece()接收两个参数:
1)一个初始值,这里是0
2)一个BinaryOperator<T>来将两个元素结合起来产生一个新值
执行原理:
首先,0作为Lambda(a)的 第一个参数,从流中获得4作为第二个参数(b)。 0 + 4得到4,它成了新的积值。然后再用 积值和流中下一个元素5调用Lambda,产生新的积值9。接下来,再用积值和下一个元素3 调用Lambda,得到12。后,用12和流中后一个元素9调用Lambda,得到终结果21。 
2.求最大值和最小值
optional<Integer> max=numbers.stream().reduce(Integer::max);
或optional<Integer> max=numbers.stream().reduce((x,y)->x>y?x:y);

optional<Integer> min=numbers.stream().reduce(Integer::min);
或optional<Integer> min=numbers.stream().reduce((x,y)->x<y?x:y);

需求:怎么用map和reduce方法数一数流中用多少个菜呢?
思路:你可以把流中个每个元素都映射成数字1,然后用reduce求和。
int count=menu.stream().map(x->1).reduce(0,(a,b)->a+b);

流使用的实例:
/**
 * 需求: 1.找出2011年发生的所有交易,并按交易额排序(从低到高)。
 * 
 * 2.交易员都在哪些不同的城市工作过
 * 
 * 3.查找所有来自于剑桥的交易员,并按姓名排序
 * 
 * 4.返回所有交易员的姓名字符串,按字母顺序排序
 * 
 * 5. 有没有交易员是在米兰工作的?
 * 
 * 6.打印生活在剑桥的交易员的所有交易额
 * 
 * 7.所有交易中,最高的交易额是多少?
 * 
 * 8.找到交易额最小的交易
 * 
 * @author Administrator
 *
 */
public class TransactionTest1 {

public static void main(String[] args) {
    // 数据初始化
    Trader raoul = new Trader("Raoul", "Cambridge");
    Trader mario = new Trader("Mario", "Milan");
    Trader alan = new Trader("Alan", "Cambridge");
    Trader brian = new Trader("Brian", "Cambridge");
    List<Transaction> transactions = Arrays.asList(new Transaction(brian, 2011, 300),
        new Transaction(raoul, 2012, 1000), new Transaction(raoul, 2011, 400), new Transaction(mario, 2012, 710),
        new Transaction(mario, 2012, 700), new Transaction(alan, 2012, 950));

// 1.从低到高
    List<Transaction> list11 = transactions.stream().filter(s -> s.getYear() == 2011)
        .sorted(Comparator.comparing(Transaction::getValue)).collect(Collectors.toList());
    System.out.println("需求1---------------------------------->");
    list11.stream().forEach(System.out::println);

// 1.从高到低
    List<Transaction> list12 = transactions.stream().filter(s -> s.getYear() == 2011)
        .sorted(Comparator.comparing(Transaction::getValue).reversed()).collect(Collectors.toList());
    list12.stream().forEach(System.out::println);

// 2.写法一
    List<String> list2 = transactions.stream().map(s -> s.getTrader().getCity()).distinct()
        .collect(Collectors.toList());
    System.out.println("需求2---------------------------------->");
    list2.stream().forEach(System.out::println);

// 2.写法二
    Set<String> list22 = transactions.stream().map(s -> s.getTrader().getCity()).collect(Collectors.toSet());
    list22.stream().forEach(System.out::println);

// 3.
    List<Trader> list3 = transactions.stream().map(s -> s.getTrader()).filter(s -> s.getCity().equals("Cambridge"))
        .sorted(Comparator.comparing(Trader::getName)).collect(Collectors.toList());
    System.out.println("需求3---------------------------------->");
    list3.stream().forEach(System.out::println);

// 4.
    String list4 = transactions.stream().map(s -> s.getTrader().getName()).distinct().sorted().reduce("",
        (a, b) -> a + b);
    System.out.println("需求4---------------------------------->");
    System.out.println(list4);

// 5.
    boolean list5 = transactions.stream().anyMatch(s -> s.getTrader().getCity().equals("Milan"));
    System.out.println("需求5---------------------------------->");
    System.out.println("list5=" + list5);

// 6
    System.out.println("需求6---------------------------------->");
    transactions.stream().filter(s -> s.getTrader().getCity().equals("Cambridge")).map(s -> s.getValue())
        .forEach(System.out::println);

// 7.写法一
    Optional<Integer> max1 = transactions.stream().map(s -> s.getValue()).reduce(Integer::max);
    System.out.println("需求7---------------------------------->");
    System.out.println("max1=" + max1);

// 7.写法二
    Optional<Integer> max2 = transactions.stream().map(Transaction::getValue).reduce((a, b) -> a > b ? a : b);
    System.out.println("max2=" + max2);

// 8.
    Optional<Transaction> list8 = transactions.stream().min(Comparator.comparing(Transaction::getValue));
    System.out.println("需求8---------------------------------->");
    System.out.println("list8=" + list8.toString());

}

}

jdk8中流的使用(二)相关推荐

  1. JDK8新特性(十二)之并行的Stream流

    1.并行Stream流介绍 一般使用的Stream流是串行的,就是在一个线程上执行,效率并不是很高,因此JDK8也推出了一个新的概念,即并行的Stream流(parallelStream).paral ...

  2. jdk8中流的使用(一)

    流是java API的新成员,是遍历数据集的高级迭代器,流还可以并行处理,无需写任何多线程代码 流定义:从支持数据处理操作的源生成的元素序列 stream API特点: 1.声明性--更简洁,更易读  ...

  3. jdk8新特性(二)Stream流式操作

    1.流处理过程 2.Stream流式分类 Stream,IntStream,LongStream,DoubleStream 3.操作符 Stream 的一系列操作必须要使用终止操作,否者整个数据流是不 ...

  4. jdk8新特性之出现This inspection finds all usages of methods that have @since tag in their documentation.

    今天在做jdk8新特性测试的时候出现了如上图的bug,提供两种解决办法. 解决思路一:            检查自己项目的JDK是不是JDK8,若不是请选择JDK8. 解决思路二: 打开自己的IDE ...

  5. linux系统安装jdk8详细教程

    文章目录 前言 一.下载jdk8的安装包 二.压缩包上传解压 1.将下载好的压缩包使用ftp工具上传到服务器 2.将压缩包解压到指定目录 三.配置jdk的环境变量 四.测试是否安装成功 前言 虚拟机版 ...

  6. JUC探险-17、线程池

    文章目录 一.线程:   ①线程的创建     如果同时继承了Thread类且实现了Runnable接口,会怎样执行?   ②线程状态   ③线程状态的转换     线程状态的转换操作       1 ...

  7. Android 安装最新版的Android Studio软件(最新版3.6)

    Android Studio的安装使用(基于最新版本3.6) 安装Android studio 一.安装JDK8(以上) 二.官网下载Android studio并安装 三.通过终端配置Mac环境 1 ...

  8. Lambda表达式的基础知识(一)

    Lambda表达式简介: 一.什么是Lambda表达式? Lambda表达式也被称为箭头函数.匿名函数.闭包 Lambda表达式提现的是轻量级函数式编程思想 '->' 符号是Lambda表达式核 ...

  9. apache Jmeter 下载、安装、汉化

    一.jdk 的安装 首先,需要先安装好jdk8(推荐) 二.官网下载 jmeter 安装 zip 包,直接解压到电脑任意硬盘 (一)jmeter官网地址:https://jmeter.apache.o ...

最新文章

  1. Excel如何设置单元格行高,办公入门
  2. JS-匀速运动-运动停止
  3. 坐标架内转换到坐标架外的公式
  4. gpu programming guide for g80(dx9)
  5. Imageloader7-获取图片需要显示的大小
  6. memcached使用详解
  7. 【转载】Linux下有趣的命令
  8. 剑指offer--从尾到头打印链表
  9. python股票网格交易法详解_股票最全“低买高卖”网格交易大法,值得收藏!
  10. 0和5(51Nod-1433)
  11. 访问控制列表(二)配置命令
  12. idea 跳转到行数,Intellij IDEA 一些不为人知的技巧
  13. poj1860Currency Exchange(bell_fordmoban)
  14. 请教淘宝API sign签名问题,望高人指点!谢谢!
  15. 每日思考第 61 期:职场PUA与情场PUA
  16. JS 格林威治时间格式(GMT)与普通时间格式的互相转换
  17. office@word官方文档查看@审阅@批注@修订
  18. 乐乐音乐播放器 欢迎页面(二)
  19. Win7无线网络共享教程:解决所有问题
  20. hibernate 出现 org.hibernate.MappingException: entity class not found 的解决办法

热门文章

  1. Maven+mybatis教程
  2. HTTP访问控制(CORS)
  3. (11)Xamarin.iOS - 新增iPhone storyboard
  4. ipone 网页版的iphone
  5. [翻译]LightRacer游戏架构
  6. “不亦乐乎”是“乐”还是“悦”?
  7. 超酷flash光芒光线特效
  8. 区块链以太坊五大开发工具,你喜欢哪个?
  9. css在兼容模式下无法引用_如何在CSS中使用深色模式
  10. javascript语法糖_语法糖和JavaScript糖尿病