import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;
public class StreamDemo {
public static void main(String[] args) {
List<Bean> beans = new ArrayList<>();
beans.add(new Bean(1, "a"));
beans.add(new Bean(2, "b"));
beans.add(new Bean(3, "c"));
//list 转 list
List<Integer> ids = beans.stream().map(Bean::getId).collect(Collectors.toList());
assertEqual("[1, 2, 3]", ids.toString());
//list 转 map(无重复key)
Map<Integer,Bean> map = beans.stream().collect(Collectors.toMap(Bean::getId, Bean -> Bean));
assertEqual("{1=Bean{id=1, name='a'}, 2=Bean{id=2, name='b'}, 3=Bean{id=3, name='c'}}", map.toString());
Map<Integer, String> map1 = beans.stream().collect(Collectors.toMap(Bean::getId, Bean::getName));
assertEqual("{1=a, 2=b, 3=c}", map1.toString());
//list 转 map(去重复key)
beans.add(new Bean(3, "d"));
map = beans.stream().collect(Collectors.toMap(Bean::getId, Bean -> Bean, (k1,k2)->k1));
assertEqual("{1=Bean{id=1, name='a'}, 2=Bean{id=2, name='b'}, 3=Bean{id=3, name='c'}}", map.toString());
map1 = beans.stream().collect(Collectors.toMap(Bean::getId, Bean::getName,(k1,k2)->k2));
assertEqual("{1=a, 2=b, 3=d}", map1.toString());
//list转map(分组)
Map<Integer, List<Bean>> map2 = beans.stream().collect(Collectors.groupingBy(Bean::getId));
assertEqual("{1=[Bean{id=1, name='a'}], 2=[Bean{id=2, name='b'}], 3=[Bean{id=3, name='c'}, Bean{id=3, name='d'}]}", map2.toString());
//过滤
List<Bean> list = beans.stream().filter(b -> b.getId() == 3).collect(Collectors.toList());
assertEqual("[Bean{id=3, name='c'}, Bean{id=3, name='d'}]", list.toString());
//求和
int sum = beans.stream().map(Bean::getId).reduce(0, Integer::sum);
assertEqual("9", Integer.toString(sum));
sum = beans.stream().mapToInt(Bean::getId).sum();
assertEqual("9", Integer.toString(sum));
//最大最小值
Optional<Bean> max = beans.stream().max(Comparator.comparing(Bean::getId));
assertEqual("Optional[Bean{id=3, name='c'}]", max.toString());
Optional<Bean> min = beans.stream().min(Comparator.comparing(Bean::getId));
assertEqual("Optional[Bean{id=1, name='a'}]", min.toString());
//两种去重方式(选第二个)
List<Bean> list1 = beans.stream().collect(Collectors.collectingAndThen(
Collectors.toCollection(() -> new TreeSet<>(Comparator.comparingInt(Bean::getId))),ArrayList::new
));
assertEqual("[Bean{id=1, name='a'}, Bean{id=2, name='b'}, Bean{id=3, name='c'}]", list1.toString());
List<Bean> list2 = beans.stream().filter(distinctByKey(Bean::getId)).collect(Collectors.toList());
assertEqual("[Bean{id=1, name='a'}, Bean{id=2, name='b'}, Bean{id=3, name='c'}]", list2.toString());
}
public static <T> Predicate<T> distinctByKey(Function<? super T, Object> keyExtractor) {
Map<Object, Boolean> map = new ConcurrentHashMap<>();
return t -> map.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}
public static class Bean{
private Integer id;
private String name;
public Bean(Integer id, String name) {
this.id = id;
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Bean{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
public static void assertEqual(String expect, String actual) {
if (!expect.equals(actual)) {
throw new RuntimeException("expect="+expect+",actual="+actual);
}
}
}
转载于:https://my.oschina.net/u/590281/blog/1922065