java中List Stream的简单使用
一,api入门案例
实体类
public class Person {
private int id;
private String name;
private String desc;
private int age;
public Person(){
}
public Person(int id, String name, String desc,int age) {
this.id = id;
this.name = name;
this.desc = desc;
this.age=age;
}
@Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
", desc='" + desc + '\'' +
'}';
}
public static List<Person> createSomeData(){
List<Person> list = new ArrayList<>();
list.add(new Person(1,"旺财1","是旺财呀",3));
list.add(new Person(1,"旺财1111","是旺财呀11",5));
list.add(new Person(2,"旺财2222","是旺财呀222",7));
list.add(new Person(3,"来福","一百岁的来福",100));
list.add(new Person(4,"常威","这个是一岁的常威",1));
list.add(new Person(5,"测试","相同一岁",1));
return list;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setDesc(String desc) {
this.desc = desc;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
api入门案例截图
下面的参考:https://www.cnblogs.com/jobbible/p/9999574.html
/**
* 测试分组:按照id分组
*/
public static void testGroupBy(){
List<Person> someData = Person.createSomeData();
//返回的Map集合中的key就是分组条件的类型
Map<Integer, List<Person>> collect = someData.stream()
.collect(Collectors.groupingBy(Person::getId));
System.out.println("根据id分组结果:"+collect);
}
/**
* 把list变为map
* 如果list有重复的key,会报错Duplicate key ....
* 可以用 (k1,k2)->k1 来设置,如果有重复的key,则保留key1,舍弃key2,所以,只有旺财1被保存到map,旺财1111没了
*/
public static void list2Map(){
List<Person> someData = Person.createSomeData();
Map<Integer, Person> collect = someData.stream()
.collect(Collectors.toMap(Person::getId, a -> a, (k1, k2) -> k1));
System.out.println("list2Map:"+collect);
}
//过滤:返回名字包含旺财的list集合
public static void filterList(){
List<Person> someData = Person.createSomeData();
Stream<Person> stream = someData.stream().filter(person -> person.getName().contains("旺财"));
List<Person> list = stream.collect(Collectors.toList());
System.out.println("过滤:"+list);
}
//求和,所有age累加
public static void calcuateAge(){
List<Person> someData = Person.createSomeData();
//int类型求和
int sum = someData.stream().mapToInt(Person::getAge).sum();
System.out.println("age求和:"+sum);
}
/**
* 最大值和最小值:
* ifPresent() (如果值存在则执行代码块)
* isPresent()将返回true,get()将返回值。
*/
public static void maxAndMin(){
Optional<Person> collect = Person.createSomeData().stream()
.collect(Collectors.maxBy(Comparator.comparing(Person::getAge)));
collect.ifPresent(person -> System.out.println("最大年龄:"+person.getName()+",age:"+person.getAge()));
//最小年龄
Optional<Person> min = Person.createSomeData().stream()
.collect(Collectors.minBy(Comparator.comparing(Person::getAge)));
Person person = min.get();
System.out.println("最小年龄:"+person);
min.ifPresent(System.out::println);
/* Optional<Dish> minDish = Dish.menu.stream().
collect(Collectors.minBy(Comparator.comparing(Dish::getCalories)));
minDish.ifPresent(System.out::println);*/
}
public static void uniqueTest(){
// 根据id去重
List<Person> unique = Person.createSomeData().stream().collect(
collectingAndThen(
toCollection(() -> new TreeSet<Person>(comparingLong(Person::getId))), ArrayList::new)
);
System.out.println("去重:"+unique);
}
根据对象某一属性分组返回对象该属性的集合
//返回id集合
List<String> collect = Person.listPerson().stream().map(Person::getId).collect(Collectors.toList());
String[] strings = new String[collect.size()];
String[] strings1 = collect.toArray(strings);
System.out.println(strings1.length);
根据对象某一属性分组,返回一个list对象
//根据分包id进行分组
Map<String, List<TSuppRevCon>> map = list.stream()
.collect(Collectors.groupingBy(TSuppRevCon::getPackageId));