zoukankan      html  css  js  c++  java
  • JavaSE:Java8新特性

    1.  案例题目

          准备一个List集合,并放入Person类型的对象,将集合中所有成年人过滤出来,放到另外一个集合,并打印出来。

     未使用Stream接口时:

     13 public class ListPersonTest {
     14 
     15     public static void main(String[] args) {
     16 
     17         // 1.准备一个List集合并放入Person类型的对象后打印
     18         List<Person> list = new LinkedList<>();
     19         list.add(new Person("zhangfei", 30));
     20         list.add(new Person("xiaoqiao", 17));
     21         list.add(new Person("zhouyu", 20));
     22         list.add(new Person("zhangfei", 30));
     23         list.add(new Person("guanyu", 35));
     24         list.add(new Person("liubei", 40));
     25         for (Person tp: list) {
     26             System.out.println(tp);
     27         }
     28 
     29         System.out.println("-------------------------------------------------------");
     30         // 2.将List集合中所有成年人过滤出来并放入另外一个集合中打印
     31         List<Person> list1 = new LinkedList<>();
     32         for (Person tp : list) {
     33             if (tp.getAge() >= 18) {
     34                 list1.add(tp);
     35             }
     36         }
     37         for (Person tp : list1) {
     38             System.out.println(tp);
     39         }
        }
      }

    2.  基本概念

          <1>java.util.stream.Stream接口,是对集合功能的增强,可以对集合元素进行复杂的查找、过滤、筛选等操作

          <2>Stream接口,借助于Lambda表达式,极大地提高编程效率和程序可读性,同时它提供串行和并行两种模式进行汇聚操作,

            并发模式能够充分利用多核处理器的优势。

    3.  使用步骤

          <1>创建Stream,通过一个数据源来获取一个流

          <2>转换Stream, 每次转换返回一个新的Stream对象

          <3>对Stream进行聚合操作并产生结果

    4.  创建方式

          <1>  方式一:通过调用集合的默认方法来获取流,如: default Stream stream()

          <2>  方式二:通过数组工具类中的静态方法来获取流,如: static IntStream stream (int[] array)

          <3>  方式三:通过Stream接口的静态方法来获取流,如:static Stream of (T... values)  

          <4>  方式四:通过Strean接口的静态方法来获取流,如: static Stream generate (Supplier <? extends T> s)

    5.  中间操作

         筛选与切片的常用方法如下:

    方法声明 功能介绍
    Stream filter(Predicate <? super T> predicate) 返回一个包含匹配元素的流
    Stream distinct() 返回不包含重复元素的流
    Stream limit(long maxSize) 返回不超过给定元素数量的流
    Stream skip(long n) 返回丢弃前n个元素后的流

       映射的常用方法如下:

    方法声明 功能介绍
    Stream map(Function<? super T, ? extends R> mapper) 返回每个处理过元素组成的流
    Stream flatMap (Function<? super T, ? extends Stream<? extends R>> mapper) 返回每个被替换过元素组成的流,并将所有流合成一个流

          排序的常用方法如下:

    方法声明 功能介绍
    Stream sorted() 返回经过自然排序后元素组成的流
    Stream sorted(Comparator <? super T> comparator) 返回经过比较器排序后元素组成的流

    6.  终止操作

          匹配与查找的方法如下:

    Optional findFirst() 返回该流的第一个元素
    boolean allMatch(Predicate<? super T> predicate) 返回所有元素是否匹配
    boolean noneMatch (Predicate <? super T> predicate) 返回没有元素是否匹配
    Optional max (Comparator <? super T> comparator) 根据比较器返回最大元素
    Otional min (Comparator <? super T> compatator) 根据比较器返回最小元素
    long count() 返回元素的个数
    void forEach(Consumer <? super T> action) 对流中每个元素执行操作

          规约的常用方法如下:

    Optional reduce(BinaryOperator accumulator) 返回结合后的元素值

          收集的常用方法如下:

    <R,A>R collect (Collector <? super T,A,R> collector) 使用收集器,对元素进行处理

    7.  使用Stream接口,实现案例题目(1.)的功能

      1 package com.lagou.task22;
      2 
      3 import java.util.Comparator;
      4 import java.util.LinkedList;
      5 import java.util.List;
      6 import java.util.Optional;
      7 import java.util.function.BinaryOperator;
      8 import java.util.function.Consumer;
      9 import java.util.function.Function;
     10 import java.util.function.Predicate;
     11 import java.util.stream.Collectors;
     12 
     13 public class ListPersonTest {
     14 
     15     public static void main(String[] args) {
     16 
     17         // 1.准备一个List集合并放入Person类型的对象后打印
     18         List<Person> list = new LinkedList<>();
     19         list.add(new Person("zhangfei", 30));
     20         list.add(new Person("xiaoqiao", 17));
     21         list.add(new Person("zhouyu", 20));
     22         list.add(new Person("zhangfei", 30));
     23         list.add(new Person("guanyu", 35));
     24         list.add(new Person("liubei", 40));
     25         for (Person tp: list) {
     26             System.out.println(tp);
     27         }
     28 
     29         System.out.println("-------------------------------------------------------");
     30         // 2.将List集合中所有成年人过滤出来并放入另外一个集合中打印
     31         List<Person> list1 = new LinkedList<>();
     32         for (Person tp : list) {
     33             if (tp.getAge() >= 18) {
     34                 list1.add(tp);
     35             }
     36         }
     37         for (Person tp : list1) {
     38             System.out.println(tp);
     39         }
     40 
     41         System.out.println("-------------------------------------------------------");
     42         // 3.使用Stream接口实现上述功能
     43         list.stream().filter(new Predicate<Person>() {
     44             @Override
     45             public boolean test(Person person) {
     46                 return person.getAge() >= 18;
     47             }
     48         }).forEach(new Consumer<Person>() {
     49             @Override
     50             public void accept(Person person) {
     51                 System.out.println(person);
     52             }
     53         });
     54 
     55         System.out.println("-------------------------------------------------------");
     56         // 4.使用lambda表达式对上述代码进行优化
     57         //list.stream().filter(person -> person.getAge() >= 18).forEach(person -> System.out.println(person));
     58         list.stream().filter(person -> person.getAge() >= 18).forEach(System.out::println);
     59 
     60         System.out.println("-------------------------------------------------------");
     61         // 5.实现对集合中元素通过流跳过2个元素后再取3个元素后打印
     62         list.stream().skip(2).limit(3).forEach(System.out::println);
     63 
     64         System.out.println("-------------------------------------------------------");
     65         // 6.实现集合中所有元素中的年龄获取出来并打印
     66         list.stream().map(new Function<Person, Integer>() {
     67             @Override
     68             public Integer apply(Person person) {
     69                 return person.getAge();
     70             }
     71         }).forEach(System.out::println);
     72 
     73         //list.stream().map(person -> person.getAge()).forEach(System.out::println);
     74         list.stream().map(Person::getAge).forEach(System.out::println);
     75 
     76         System.out.println("-------------------------------------------------------");
     77         // 7.实现集合中所有元素的自然排序并打印
     78         list.stream().sorted().forEach(System.out::println);
     79 
     80         System.out.println("-------------------------------------------------------");
     81         // 8.判断集合中是否没有元素的年龄是大于45岁的
     82         boolean b1 = list.stream().noneMatch(new Predicate<Person>() {
     83             @Override
     84             public boolean test(Person person) {
     85                 return person.getAge() > 45;
     86             }
     87         });
     88         System.out.println("b1 = " + b1); // true
     89 
     90         b1 = list1.stream().noneMatch(person -> person.getAge() > 45);
     91         System.out.println("b1 = " + b1); // true
     92 
     93         System.out.println("-------------------------------------------------------");
     94         // 9.按照指定的比较器规则获取集合所有元素中的最大值
     95         Optional<Person> max = list.stream().max(new Comparator<Person>() {
     96             @Override
     97             public int compare(Person o1, Person o2) {
     98                 return o1.getAge() - o2.getAge();
     99             }
    100         });
    101         System.out.println("按照年龄排序后的最大值是:" + max);
    102 
    103         max = list.stream().max((o1, o2) -> o1.getAge() - o2.getAge());
    104         System.out.println("按照年龄排序后的最大值是:" + max);
    105 
    106         System.out.println("-------------------------------------------------------");
    107         // 10.实现将集合中所有元素的年龄映射出来并进行累加后打印
    108         Optional<Integer> reduce = list.stream().map(Person::getAge).reduce(new BinaryOperator<Integer>() {
    109             @Override
    110             public Integer apply(Integer integer, Integer integer2) {
    111                 return integer + integer2;
    112             }
    113         });
    114         System.out.println("最终所有年龄的累加和是:" + reduce); // 172
    115 
    116         //reduce = list.stream().map(Person::getAge).reduce(((integer, integer2) -> integer + integer2));
    117         reduce = list.stream().map(Person::getAge).reduce((Integer::sum));
    118         System.out.println("最终所有年龄的累加和是:" + reduce); // 172
    119 
    120         System.out.println("-------------------------------------------------------");
    121         // 11.实现将集合中所有元素的姓名映射出来并收集到集合中打印
    122         list.stream().map(Person::getName).collect(Collectors.toList()).forEach(System.out::println);
    123     }
    124 }
  • 相关阅读:
    10 个深恶痛绝的 Java 异常。。
    为什么公司宁愿 25K 重新招人,也不给你加到 20K?原因太现实……
    推荐一款代码神器,代码量至少省一半!
    Spring Cloud Greenwich 正式发布,Hystrix 即将寿终正寝。。
    hdu 3853 LOOPS(概率 dp 期望)
    hdu 5245 Joyful(期望的计算,好题)
    hdu 4336 Card Collector(期望 dp 状态压缩)
    hdu 4405 Aeroplane chess(概率+dp)
    hdu 5036 Explosion(概率期望+bitset)
    hdu 5033 Building (单调栈 或 暴力枚举 )
  • 原文地址:https://www.cnblogs.com/JasperZhao/p/14949826.html
Copyright © 2011-2022 走看看