java8 的 Stream

300 阅读2分钟

Stream流式计算

计算都应该交给流来操作

实体类

User

package com.zhong.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {

    private int id;
    private int age;
    private String name;

}

测试类,测试stream里的一些方法

Test

package com.zhong.stream;

import com.zhong.entity.User;

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

public class Test {

    /**  计算
     * 题目要求:一分钟内完成此题,只能用一行代码实现!
     * 现在有5个用户!筛选:
     * 1、ID 必须是偶数
     * 2、年龄必须大于23岁
     * 3、用户名转为大写字母
     * 4、用户名字母倒着排序
     * 5、只输出一个用户!
     */
    public static void main(String[] args) {

        User u1 = new User(10, 12, "mao");
        User u2 = new User(20, 20, "gou");
        User u3 = new User(30, 35, "ji");
        User u4 = new User(40, 68, "niao");
        User u5 = new User(5, 5, "chong");
        User u6 = new User(60, 25, "yu");

        List<User> list = Arrays.asList(u1,u2,u3,u4,u5,u6);

        //计算交给stream流
        //对list进行一些处理,map之后再用sorted 会不一样
        list.stream()
                .filter(user -> { return user.getId() % 2 == 0; })
                .filter(user -> { return user.getAge() > 23 ;})
                .map(user -> { return user.getName().toUpperCase(); })
                .sorted((one,two)->{ return two.compareTo(one);}) //用户名字母倒着排序
                .limit(6)
                .forEach(System.out::println);
        /*
        结果:
            YU
            NIAO
            JI
         */
        System.out.println("----------------------------------");

        //对list排序
        list.stream()
                .sorted(Comparator.comparing(User::getAge)
                        .reversed()//先对age排,在对id排
                        .thenComparing(User::getId)) //逆序
                .forEach(System.out::println);
        /*
        结果:
            User(id=40, age=68, name=niao)
            User(id=30, age=35, name=ji)
            User(id=60, age=25, name=yu)
            User(id=20, age=20, name=gou)
            User(id=10, age=12, name=mao)
            User(id=5,  age=5,  name=chong)
         */
        System.out.println("----------------------------------");

        //取出user的name属性收集起来放到list里面
        List<String> collect = list.stream()
                .map(User::getName)
                .collect(Collectors.toList());
        System.out.println(collect);
        /*
        结果:
            [mao, gou, ji, niao, chong, yu]
         */
        System.out.println("----------------------------------");

        //先用map,再用sortd ,排序就会利用map的结果来排序
        list.stream()
                .map(User::getId)
                .sorted(((o1, o2) -> o1.compareTo(o2) )) //升序
                .forEach(System.out::println);
        /*
        结果:
            5
            10
            20
            30
            40
            60
         */
    }
}
// id作为map的key,此对象作为map的value  -> (Id, List<User>)
        System.out.println("----------------------------------");
        Map<Integer, List<User>> map = list.stream()
                .collect(Collectors.groupingBy(user -> user.getId()));
        System.out.println(map);
        /*
        结果:
            {
                20=[User(id=20, age=20, name=gou)],
                5 =[User(id=5,  age=5,  name=chong)],
                40=[User(id=40, age=68, name=niao)],
                10=[User(id=10, age=12, name=mao)],
                60=[User(id=60, age=25, name=yu)],
                30=[User(id=30, age=35, name=ji)]
            }
         */