直接看测试代码,关于什么是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>的方法
下面这些方法执行依然会返回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()));
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()));
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()));
二、搜集
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(" <> ", "[", "]")));
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()));
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()));
按名称去重结果