java8新特征---stream

首先创建个实体类

package com.example.demo.entity;

/**
 * hlvy
 *
 * @author heng
 **/
public class hlvy {
    /**
     * 姓名
     */
    private String name;

    /**
     * 年龄
     */
    private Integer age;


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

接着:

package com.example.demo;

import com.example.demo.entity.hlvy;

import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * HlvyTest
 *
 * @author heng
 **/
public class HlvyTest {

    public static void main(String[] args) {

        /**
         * java8新特征 stream map
         * 拿到集合里实体类的某个字段
         */
        List<hlvy> list = new ArrayList<hlvy>();
         hlvy h = new hlvy();
         hlvy h1 = new hlvy();
         h.setName("yanyan");
         h.setAge(18);
         h1.setName("heng");
         h1.setAge(18);
        list.add(h);
        list.add(h1);


        List<String> name = list.stream().map(hlvy::getName).collect(Collectors.toList());
/*
        for (String s : name) {
            System.out.println(s);
        }*/


        /**
         * java8新特征 stream
         * %2==0就添加到集合 filter  让符合条件的通过,不符合的过滤掉
         */
        List <Integer> nums = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
        List<Integer> listTwo = nums.stream().filter(num -> num % 2 == 0).collect(Collectors.toList());
       /* for (Integer integer : listTwo) {
            System.out.println(integer);
        }*/
        /**
         * java8新特征 stream distinct 对数据进行去重
         * %2==0就添加到集合 并且不重复
         */
        List <Integer> numsOne = Arrays.asList(1,2,2,3,4,5,6,6,7,8,9,10,10);
        List<Integer> listThree = numsOne.stream().filter(num -> num % 2 == 0).distinct().collect(Collectors.toList());
      /*  for (Integer integer : listThree) {
            System.out.println(integer);
        }*/
        /**
         * java8新特征 stream limit  限制数据出现的条数  limit返回包含前n个元素的流,当集合大小小于n时,则返回实际长度
         * 两个是 10的数字
         */
        List <Integer> numsTwo = Arrays.asList(1,2,2,3,4,5,6,6,7,8,9,10,10);
        List<Integer> listFour = numsTwo.stream().filter(num -> num  == 10).limit(2).collect(Collectors.toList());
      /*for (Integer integer : listFour) {
            System.out.println(integer);
        }*/
        /**
         * java8新特征 stream skip 与limit操作相反 跳过前n个元素
         * 跳过前两个,从第三个开始
         */
        List <Integer> numsFive = Arrays.asList(1,2,2,3,4,5,6,6,7,8,9,10,10);
        List<Integer> listFive = numsFive.stream().filter(num -> num  > 1).skip(2).collect(Collectors.toList());
      /*for (Integer integer : listFive) {
            System.out.println(integer);
        }*/
        /**
         * java8新特征 stream
         * 计算和
         */
        /**
         * java8新特征 stream map
         * 拿到集合里实体类的某个字段
         */
        List<hlvy> list2 = new ArrayList<hlvy>();
        hlvy h2 = new hlvy();
        hlvy h3 = new hlvy();
        h2.setName("yanyan");
        h2.setAge(18);
        h3.setName("heng");
        h3.setAge(18);
        list2.add(h2);
        list2.add(h3);


        Integer ages = list2.stream().filter(list3 -> list3.getAge() > 1).mapToInt(hlvy::getAge).sum();
       // System.out.println(ages);
/**
 * 使用这些数值流的好处还在于可以避免jvm装箱操作所带来的性能消耗
 * flatMap   用于合并用
 */

        List<Integer> collected0 = new ArrayList<>();
        collected0.add(1);
        collected0.add(3);
        collected0.add(5);
        List<Integer> collected1 = new ArrayList<>();
        collected1.add(2);
        collected1.add(4);
        collected1 = Stream.of(collected0, collected1)
                .flatMap(num -> num.stream()).collect(Collectors.toList());
      //  System.out.println(collected1);// 1,3,5,2,4


        /**
         * java8新特征 allMatch   用于检测是否全部都满足指定的参数行为,如果全部满足则返回true
         * 如果数组的数字全部大于7则返回true否则false
         */
        List <Integer> allMatchs = Arrays.asList(1,2,2,3,4,5,6,6,7,8,9,10,10);
       boolean listallMatchs = allMatchs.stream().allMatch(mas -> mas > 7);
     //   System.out.println(listallMatchs);
        /**
         * java8新特征  anyMatch   检测是否存在一个或多个满足指定的参数行为,如果满足则返回true
         * 如果数组的数字y有等于7的返回true
         */
        List <Integer> allMatchs2 = Arrays.asList(1,2,2,3,4,5,6,6,7,8,9,10,10);
       boolean listallMatchs2 = allMatchs2.stream().anyMatch(numt -> numt==7);
       // System.out.println(listallMatchs2);
        /**
         * java8新特征 noneMathch  检测是否不存在满足指定行为的元素
         *不存在返回true
         */
        List <Integer> allMatchs3 = Arrays.asList(1,2,2,3,4,5,6,6,7,8,9,10,10);
       boolean listallMatchs3 = allMatchs3.stream().noneMatch(numt -> numt==17);
     //   System.out.println(listallMatchs3);
        /**
         * java8新特征 findFirst 返回满足条件的第一条元素
         */
        List <Integer> allMatchs4 = Arrays.asList(1,2,3,4,5,6,6,7,8,9,10,10);
        Optional<Integer> listallMatchs4 = allMatchs4.stream().filter(numt -> numt>1).findFirst();
       if(listallMatchs4.isPresent()){//如果里面存有值
           //System.out.println(listallMatchs4.get());
       }
// 前面例子中的方法
        int totalAge = list.stream()
                .filter(hlvy -> "yanyan".equals(hlvy.getName()))
                .mapToInt(hlvy::getAge).sum();
       // System.out.println(totalAge);
// 归约操作
        int totalAge11 = list.stream()
                .filter(hlvy -> "yanyan".equals(hlvy.getName()))
                .map(hlvy::getAge)
                .reduce(0, (a, b) -> a + b);
      //  System.out.println(totalAge11);

// 进一步简化
        int totalAge2 = list.stream()
                .filter(hlvy -> "yanyan".equals(hlvy.getName()))
                .map(hlvy::getAge)
                .reduce(0, Integer::sum);
        //System.out.println(totalAge2);

// 采用无初始值的重载版本,需要注意返回Optional
        Optional<Integer> totalAge22 = list.stream()
                .filter(hlvy -> "yanyan".equals(hlvy.getName()))
                .map(hlvy::getAge)
                .reduce(Integer::sum);  // 去掉初始值
       // if (totalAge22.isPresent()) System.out.println(totalAge22.get());


        /**
         * 收集  前面利用collect(Collectors.toList())是一个简单的收集操作,是对处理结果的封装
         *来自于java.util.stream.Collectors,我们可以称之为收集器。
         */
        long count = list.stream().collect(Collectors.counting());
        long count1 = list.stream().count();
        //System.out.println(count+"-------"+count1);

        /**
         * 求年龄的最大值和最小值
         */
        // 求最大年龄
        Optional<hlvy> olderStudent = list.stream().collect(Collectors.maxBy((s1, s2) -> s1.getAge() - s2.getAge()));
       // System.out.println(olderStudent.get().getAge());
        // 进一步简化
        Optional<hlvy> olderStudent2 = list.stream().collect(Collectors.maxBy(Comparator.comparing(hlvy::getAge)));
      //  System.out.println(olderStudent2.get().getAge());
        // 求最小年龄
        Optional<hlvy> olderStudent3 = list.stream().collect(Collectors.minBy(Comparator.comparing(hlvy::getAge)));

       // System.out.println(olderStudent3.get().getAge());

        /**
         * 求年龄总和
         */
        int totalAge4 = list.stream().collect(Collectors.summingInt(hlvy::getAge));
       // System.out.println(totalAge4);

        /**
         * 求年龄的平均值
         */
        double avgAge = list.stream().collect(Collectors.averagingInt(hlvy::getAge));
      //  System.out.println(avgAge);

        /**
         * 一次性得到元素个数、总和、均值、最大值、最小值
         */
        IntSummaryStatistics statistics = list.stream().collect(Collectors.summarizingInt(hlvy::getAge));
       // System.out.println(statistics.toString());

        /**
         * 字符串拼接
         */
        String names = list.stream().map(hlvy::getName).collect(Collectors.joining());
        String names2 = list.stream().map(hlvy::getName).collect(Collectors.joining(", "));
       // System.out.println(names);  //yanyanheng
       // System.out.println(names2); //yanyan, heng

        /**
         * 分组
         *  在数据库操作中,我们可以通过GROUP BY关键字对查询到的数据进行分组,
         *  java8的流式处理也为我们提供了这样的功能Collectors.groupingBy来操作集合。
         */
        Map<String, List<hlvy>> groups = list.stream().collect(Collectors.groupingBy(hlvy::getName));
     //   System.out.println(groups.get("yanyan").get(0).getName()); //yanyan

        /**
         * groupingBy接收一个分类器Function<? super T, ? extends K> classifier,我们可以自定义分类器来实现需要的分类效果。
         *上面演示的是一级分组,我们还可以定义多个分类器实现 多级分组,比如我们希望在按学校分组的基础之上再按照专业进行分组,实现如下:
         */

        Map<String, Map<String, List<hlvy>>> groups2 = list.stream().collect(
                Collectors.groupingBy(hlvy::getName,  // 一级分组,按学校
                        Collectors.groupingBy(hlvy::getName)));  // 二级分组,按专业
      //  System.out.println(groups2.get("yanyan").get("yanyan").get(0).getAge());

        /**
         * 实际上在groupingBy的第二个参数不是只能传递groupingBy,
         * 还可以传递任意Collector类型,比如我们可以传递一个Collector.counting,用以统计每个组的个数:
         * 如果我们不添加第二个参数,则编译器会默认帮我们添加一个Collectors.toList()。
         */

        Map<String, Long> groups3 = list.stream().collect(Collectors.groupingBy(
                hlvy::getName, Collectors.counting()));
        System.out.println(groups3.toString());


    }
}

猜你喜欢

转载自blog.csdn.net/qq_39313596/article/details/83420366