java8新特性之Stream介绍

直接看测试代码,关于什么是stream之类的介绍就不多说了。

首先创建了一个简单的User类

package com.java8.pojo;

import lombok.Data;

import java.util.Objects;

/**
 * <p></p>
 *
 * @author anna2019/3/13 13:41
 * @version V1.0
 * @modificationHistory=========================逻辑或功能性重大变更记录
 * @modify by user: {修改人} 2019/3/13
 * @modify by reason:User:{原因}
 */
@Data
public class User implements Comparable{

    private String name;
    private Integer age;
    private Integer sex;
    //价值
    private Long value;
    //薪水
    private Float salary;

    public User(String name, Integer age, Integer sex, Long value, Float salary) {
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.value = value;
        this.salary = salary;
    }

    @Override
    public int compareTo(Object o) {
        return this.age-((User)o).getAge();
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex=" + sex +
                ", value=" + value +
                ", salary=" + salary +
                '}';
    }

}

稍微说明一下,User类实现了Comparable接口并重写compareTo方法主要用于下面的sorted()这个方法,否则会抛出异常,因为sorted()方法的排序是基于这个接口的比较规则的。下面开始对Stream的不同方法进行讲解

public class UserService {

    public static List<User> userList = new ArrayList<>(10);
    static {
        for (int i=0;i<10;i++){
            userList.add(new User("name"+i,i+10,1,i+1L,i+2.0f));
            if (i==2 || i==5){
                userList.add(new User("name"+i,i+10,1,i+1L,i+2.0f));
            }
            if (i==7||i==8){
                userList.add(new User("name"+i,i-10,1,i-10L,i-20.0f));
            }
        }
    }

}

List<User> userList = UserService.userList;

1、返回Stream<T>的方法

java8新特性之Stream介绍

下面这些方法执行依然会返回Stream<T>,本文用User这个类来作为这个泛型T。

1.1>forEach(Consumer<? super T> action)

userList.stream().forEach(user -> System.out.println(user.toString()));

1.2>sorted()   要求User类需要实现Comparable接口并重写compareTo(Object o)方法
        

userList.stream().sorted().forEach(user -> System.out.println(user.toString()));

1.3>sorted(Comparator<? super T> comparator)

        userList.stream().sorted((user1,user2)->{
            if (user1.getSalary()>user2.getSalary()){
                return 1;
            }else if (user1.getSalary()<user2.getSalary()){
                return -1;
            }else {
                return 0;
            }
        }).forEach(user -> System.out.println(user.getSalary()));

1.4>filter(Predicate<? super T> predicate),把小于等于15岁的过滤

userList.stream().filter(user -> user.getAge()>15).forEach(user -> System.out.println(user.toString()));

java8新特性之Stream介绍

1.5>distinct(),去除重复的元素,根据equals()方法来判断是否相等的元素

userList.stream().distinct().forEach(user -> System.out.println(user.toString()));

1.6>limit(long maxSize)返回前几个,如果maxSize大于集合的大小,则全部返回,如下面返回前3个元素

userList.stream().limit(3L).forEach(user -> System.out.println(user.toString()));

java8新特性之Stream介绍

1.7>peek(Consumer<? super T> action),这个方法主要用来支持调试用

userList.stream().peek(user -> user.setAge(10)).forEach(user -> System.out.println(user.toString()));

8>skip(long n)--跳过2个元素,如果跳过的大小比大于集合大小,返回一个空的stream

userList.stream().skip(2L).forEach(user -> System.out.println(user.toString()));
System.out.println("skip 20");
userList.stream().skip(20L).forEach(user -> System.out.println(user.toString()));

java8新特性之Stream介绍

二、搜集

2.1>collect()

2.1.1>Collectors.groupingBy

 Map<String, List<User>> map = userList.stream().collect(Collectors.groupingBy(temp->temp.getName()));
map.forEach((key,value)-> System.out.println(key+" "+value.toString()));

2.1.2>Collectors.joining

 List<String> abclist = Arrays.asList("A", "B", "C","D","E");
//直接将输出结果拼接
System.out.println(abclist.stream().collect(Collectors.joining()));
//每个输出结果之间加拼接符号“|”
System.out.println(abclist.stream().collect(Collectors.joining(" | ")));
//输出结果开始头为Start--,结尾为--End,中间用拼接符号“||”
System.out.println(abclist.stream().collect(Collectors.joining(" <> ", "[", "]")));

java8新特性之Stream介绍

2.1.3>Collectors.toList    Collectors.toSet   Collectors.toCollection 

//Collectors.toList()
List<User> users = userList.stream().collect(Collectors.toList());
//Collectors.toSet()
Set<User> userSet = userList.stream().collect(Collectors.toSet());
//Collectors.toCollection 使用自定义的集合
userList.stream().collect(Collectors.toCollection(TreeSet::new)).forEach(System.out::println);
userList.stream().collect(Collectors.toCollection(LinkedList::new)).forEach(System.out::println);

2.1.4>Collectors.partitioningBy(Predicate<? super T> p) 分为true和false的两个元素的map

Map<Boolean, List<User>> listMap = userList.stream().collect(Collectors.partitioningBy(u -> u.getAge() > 16));
listMap.forEach((key,value)-> System.out.println(key+" "+value.stream().map(user->user.getAge()).collect(Collectors.toList()).toString()));

2.1.5 Collectors.toMap

//Collectors.toMap 需要保证键唯一,否则会报错
Map<String, User> userMap = userList.stream().distinct().collect(Collectors.toMap(user -> user.getName()+"_"+user.getAge(), user -> user));
userMap.forEach((k,v)-> System.out.println(k+" "+v.toString()));

java8新特性之Stream介绍

2.1.6 按照属性去重并转map 

 public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
        Set<Object> seen = ConcurrentHashMap.newKeySet();
        return t -> seen.add(keyExtractor.apply(t));
    }


userList.stream().filter(distinctByKey(user -> user.getName()))
                .collect(Collectors.toMap(e->e.getName(),e->e)).forEach((k,v)-> System.out.println(k+" "+v.toString()));

按名称去重结果

java8新特性之Stream介绍