Java8 - sum求和,将 List 集合转为 Map,key去重(groupingBy),sorted排序
代码语言:javascript复制package com.example.core.mydemo.java8;
public class GoodsPriceDTO {
private Integer id;
private String goodName;
private Integer amount;
//重写toString方法,System可以打印输出对象
@Override
public String toString() {
return "GoodsPriceDTO{"
"id=" id
", goodName='" goodName '''
", amount=" amount
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getGoodName() {
return goodName;
}
public void setGoodName(String goodName) {
this.goodName = goodName;
}
public Integer getAmount() {
return amount;
}
public void setAmount(Integer amount) {
this.amount = amount;
}
}
代码语言:javascript复制package com.example.core.mydemo.java8;
import java.util.*;
import java.util.stream.Collectors;
public class GoodsTotalTest {
public static void main(String[] args) {
List<GoodsPriceDTO> goodsPriceDTOS = new ArrayList<GoodsPriceDTO>();
GoodsPriceDTO dto = new GoodsPriceDTO();
dto.setId(1);
dto.setGoodName("Apple1");
dto.setAmount(27);
goodsPriceDTOS.add(dto);
GoodsPriceDTO dto2 = new GoodsPriceDTO();
dto2.setId(2);
dto2.setGoodName("Orange");
dto2.setAmount(28);
goodsPriceDTOS.add(dto2);
GoodsPriceDTO dto3 = new GoodsPriceDTO();
dto3.setId(3);
dto3.setGoodName("Banana");
dto3.setAmount(29);
goodsPriceDTOS.add(dto3);
GoodsPriceDTO dto4 = new GoodsPriceDTO();
dto4.setId(4);
dto4.setGoodName("Apple4");
dto4.setAmount(23);
goodsPriceDTOS.add(dto4);
//重复键key
GoodsPriceDTO dto5 = new GoodsPriceDTO();
dto5.setId(4);
dto5.setGoodName("Apple5");
dto5.setAmount(100);
goodsPriceDTOS.add(dto5);
int amt = Optional.ofNullable(goodsPriceDTOS)
.orElseGet(ArrayList::new)
.stream()
.filter(x -> x != null && ("Apple".equals(x.getGoodName()))).mapToInt(GoodsPriceDTO::getAmount).sum();
System.out.println("amt=" amt);
//Java8 - 将 List 集合转为 Map
//List转map
Map<Integer,GoodsPriceDTO> map = Optional.ofNullable(goodsPriceDTOS)
.orElseGet(ArrayList::new)
.stream().collect(Collectors.toMap(GoodsPriceDTO::getId,GoodsPriceDTO->GoodsPriceDTO,(oldValue,newValue)->oldValue));
System.out.println("map=" map);
//List转map -2
Map<Integer,String> map2 = Optional.ofNullable(goodsPriceDTOS)
.orElseGet(ArrayList::new)
.stream().collect(Collectors.toMap(GoodsPriceDTO::getId,GoodsPriceDTO::getGoodName,(oldValue,newValue)->oldValue));
System.out.println("map2=" map2);
//如果出现相同的key,那么会抛出重复key的异常
//Duplicate key com.example.core.mydemo.java8.GoodsPriceDTO@20ad9418
//输出: map2={1=Apple1, 2=Orange, 3=Banana, 4=Apple4}
//刚才上面出现重复的ID,是根据值进行覆盖,在某些情况下需要映射成列表。即:List -> Map<Integer, List>的情况。
Map<Integer,List<GoodsPriceDTO>> map3 = Optional.ofNullable(goodsPriceDTOS)
.orElseGet(ArrayList::new)
.stream().collect(Collectors.groupingBy(GoodsPriceDTO::getId));
System.out.println("map3=" map3);
//map3={1=[GoodsPriceDTO{id=1, goodName='Apple1', amount=27}], 2=[GoodsPriceDTO{id=2, goodName='Orange', amount=28}], 3=[GoodsPriceDTO{id=3, goodName='Banana', amount=29}], 4=[GoodsPriceDTO{id=4, goodName='Apple4', amount=23}, GoodsPriceDTO{id=4, goodName='Apple5', amount=100}]}
//Comparator 升序
List<GoodsPriceDTO> newSortedList = Optional.ofNullable(goodsPriceDTOS)
.orElseGet(ArrayList::new)
.stream().sorted(Comparator.comparing(GoodsPriceDTO::getAmount)).collect(Collectors.toList());
//按价格排序:
newSortedList.stream().forEach(x -> {
System.out.println("x=" x);
});
//Comparator 降序
List<GoodsPriceDTO> newSortedList1 = Optional.ofNullable(goodsPriceDTOS)
.orElseGet(ArrayList::new)
.stream().sorted(new Comparator<GoodsPriceDTO>() {
@Override
public int compare(GoodsPriceDTO o1, GoodsPriceDTO o2) {
return o2.getAmount().compareTo(o1.getAmount());
}
}).collect(Collectors.toList());
//按价格排序:
newSortedList1.stream().forEach(x -> {
System.out.println("x1=" x);
});
//升序
List<GoodsPriceDTO> newSortedList2 = Optional.ofNullable(goodsPriceDTOS)
.orElseGet(ArrayList::new)
.stream().sorted((a,b) ->(a.getAmount() - b.getAmount())).collect(Collectors.toList());
//按价格排序:
newSortedList2.stream().forEach(x -> {
System.out.println("x2=" x);
});
//降序
List<GoodsPriceDTO> newSortedList3 = Optional.ofNullable(goodsPriceDTOS)
.orElseGet(ArrayList::new)
.stream().sorted((a,b) ->(b.getAmount() - a.getAmount())).collect(Collectors.toList());
//按价格排序:
newSortedList3.stream().forEach(x -> {
System.out.println("x3=" x);
});
}
}