• 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 }
  • 相关阅读:
    uoj35 后缀排序
    bzoj1026windy数
    poj2761 feed the dog
    codevs2875RY哥查字典
    bzoj1683[Usaco2005 Nov]City skyline 城市地平线
    codevs2464超级麻将
    初赛乱记
    让NOI Linux变得可用
    [HAOI2015] 按位或
    一句话CF
  • 原文地址:https://www.cnblogs.com/JasperZhao/p/14949826.html
Copyright © 2020-2023  润新知