關注公眾號“AI碼師”領取2021最新面試資料一份,公眾號內回復“原始碼”,獲取本專案原始碼
最近在專案上面經常使用lambada運算式,但是總是記不住,一直都在百度,寫完之后就忘記了,感覺很費時間;這次就花點時間,把一些常用的lambada 處理集合的實體都保存了下來(去重,分組,求和,list轉map等等),以后就不用到處找了,剛好也可以給同學們分享下;另外也把一些關于使用lambada時遇到的坑也給大家一起分享下,所有代碼拿來即用!!!本檔案持續更新…
實體演示
商品物體
@Data
@AllArgsConstructor
public class GoodInfo {
private String mallSource;
private String skuNo;
private int price;
private int monthCount;
}
排序
集合排序在專案中用的頻率還蠻高,這里以按照銷量排序為例
List<GoodInfo> goodInfos = Arrays.asList();
goodInfos.add(new GoodInfo("tb", "tb_1112312312", 199, 100000));
goodInfos.add(new GoodInfo("tb", "tb_23534231231", 399, 10));
goodInfos.add(new GoodInfo("jd", "jd_1110080098", 299, 100));
goodInfos.add(new GoodInfo("jd", "jd_412313123", 99, 10000000));
goodInfos.add(new GoodInfo("pdd", "pdd_354532431", 599, 1));
goodInfos.add(new GoodInfo("pdd", "pdd_1423124131", 499, 10));
// 按照銷量正序 從小到大排序
goodInfos.sort(Comparator.comparing(GoodInfo::getMonthCount));
// 按照銷量倒序 從大到小排序
goodInfos.sort(Comparator.comparing(GoodInfo::getMonthCount).reversed());
取最大值/取最小值/求和
List<GoodInfo> goodInfos = Arrays.asList();
goodInfos.add(new GoodInfo("tb", "tb_1112312312", 199, 100000));
goodInfos.add(new GoodInfo("tb", "tb_23534231231", 399, 10));
goodInfos.add(new GoodInfo("jd", "jd_1110080098", 299, 100));
goodInfos.add(new GoodInfo("jd", "jd_412313123", 99, 10000000));
goodInfos.add(new GoodInfo("pdd", "pdd_354532431", 599, 1));
goodInfos.add(new GoodInfo("pdd", "pdd_1423124131", 499, 10));
// 獲取最大銷量 注意如果求最大值是在filter之后使用例如,goodInfos.stream().filter().max一定要判斷filter后集合數量是否不為空,否則使用max的get方法會報錯
GoodInfo hotGoodInfo = goodInfos.stream().max(Comparator.comparing(GoodInfo::getMonthCount)).get();
// 求最低價格商品
GoodInfo lowPriceGoodInfo = goodInfos.stream().min(Comparator.comparing(GoodInfo::getMonthCount)).get();
// 計算商品總價格
int sum = goodInfos.stream().mapToInt(person -> person.getPrice()).sum();
// 求平均價格
double avg = goodInfos.stream().mapToInt(person -> person.getPrice()).average().getAsDouble();
遍歷
List<GoodInfo> goodInfos = Arrays.asList();
goodInfos.add(new GoodInfo("tb", "tb_1112312312", 199, 100000));
goodInfos.add(new GoodInfo("tb", "tb_23534231231", 399, 10));
goodInfos.add(new GoodInfo("jd", "jd_1110080098", 299, 100));
goodInfos.add(new GoodInfo("jd", "jd_412313123", 99, 10000000));
goodInfos.add(new GoodInfo("pdd", "pdd_354532431", 599, 1));
goodInfos.add(new GoodInfo("pdd", "pdd_1423124131", 499, 10));
// 遍歷輸出所有商品id
goodInfos.forEach(
goodInfo -> {
System.out.println(goodInfo.getSkuNo());
});
物體集合 轉 單個屬性的集合
往往在我們專案中會有這樣的需求:我需要提取集合中某一個屬性,然后組裝成集合,通常做法是先創建一個字串集合,然后遍歷原始集合,取出資料,放到字串集合中,雖然也能實作功能,但是不免太過于繁瑣,現在使用一行lambada運算式即可搞定:
List<GoodInfo> goodInfos = Arrays.asList();
goodInfos.add(new GoodInfo("tb", "tb_1112312312", 199, 100000));
goodInfos.add(new GoodInfo("tb", "tb_23534231231", 399, 10));
goodInfos.add(new GoodInfo("jd", "jd_1110080098", 299, 100));
goodInfos.add(new GoodInfo("jd", "jd_412313123", 99, 10000000));
goodInfos.add(new GoodInfo("pdd", "pdd_354532431", 599, 1));
goodInfos.add(new GoodInfo("pdd", "pdd_1423124131", 499, 10));
// 將list轉為某個屬性map 這里是把所有skuno全部取出來 作為集合
List<String> skuNos = goodInfos.stream().map(goodInfo -> goodInfo.getSkuNo()).collect(Collectors.toList());
物體集合 轉 map 回傳
List<GoodInfo> goodInfos = Arrays.asList();
goodInfos.add(new GoodInfo("tb", "tb_1112312312", 199, 100000));
goodInfos.add(new GoodInfo("tb", "tb_23534231231", 399, 10));
goodInfos.add(new GoodInfo("jd", "jd_1110080098", 299, 100));
goodInfos.add(new GoodInfo("jd", "jd_412313123", 99, 10000000));
goodInfos.add(new GoodInfo("pdd", "pdd_354532431", 599, 1));
goodInfos.add(new GoodInfo("pdd", "pdd_1423124131", 499, 10));
// 將list轉為map,key 為商品id
Map<String, GoodInfo> map = goodInfos.stream().collect(Collectors.toMap(GoodInfo::getSkuNo, goodInfo -> goodInfo));
物體集合按照某個屬性分組
List<GoodInfo> goodInfos = Arrays.asList();
goodInfos.add(new GoodInfo("tb", "tb_1112312312", 199, 100000));
goodInfos.add(new GoodInfo("tb", "tb_23534231231", 399, 10));
goodInfos.add(new GoodInfo("jd", "jd_1110080098", 299, 100));
goodInfos.add(new GoodInfo("jd", "jd_412313123", 99, 10000000));
goodInfos.add(new GoodInfo("pdd", "pdd_354532431", 599, 1));
goodInfos.add(new GoodInfo("pdd", "pdd_1423124131", 499, 10));
// 按照商品來源分組
Map<String, List<GoodInfo>> map = goodInfos.stream().collect(Collectors.groupingBy(GoodInfo::getMallSource));
過濾資料(記得接收)
List<GoodInfo> goodInfos = Arrays.asList();
goodInfos.add(new GoodInfo("tb", "tb_1112312312", 199, 100000));
goodInfos.add(new GoodInfo("tb", "tb_23534231231", 399, 10));
goodInfos.add(new GoodInfo("jd", "jd_1110080098", 299, 100));
goodInfos.add(new GoodInfo("jd", "jd_412313123", 99, 10000000));
goodInfos.add(new GoodInfo("pdd", "pdd_354532431", 599, 1));
goodInfos.add(new GoodInfo("pdd", "pdd_1423124131", 499, 10));
// 過濾商品價格大于300的
// todo 過濾后一定要使用集合接收,否則等于沒有過濾
List<GoodInfo> collect =
goodInfos.stream()
.filter(goodInfo -> goodInfo.getPrice() > 300)
.collect(Collectors.toList());
collect.forEach(
goodInfo -> {
System.out.println(goodInfo.getPrice());
});
去重(兩種方法可選)
方法一 set 去重
List<GoodInfo> goodInfos = Arrays.asList();
goodInfos.add(new GoodInfo("tb", "tb_1112312312", 199, 100000));
goodInfos.add(new GoodInfo("tb", "tb_23534231231", 399, 10));
goodInfos.add(new GoodInfo("jd", "jd_1110080098", 299, 100));
goodInfos.add(new GoodInfo("jd", "jd_1110080098", 299, 100));
goodInfos.add(new GoodInfo("jd", "jd_412313123", 99, 10000000));
goodInfos.add(new GoodInfo("pdd", "pdd_354532431", 599, 1));
goodInfos.add(new GoodInfo("pdd", "pdd_1423124131", 499, 10));
// 使用treeset 集合來實作去重,這里一定要使用集合接收,不然等于沒有去重
List<GoodInfo> goodInfos1 =
goodInfos.stream()
.collect(
Collectors.collectingAndThen(
Collectors.toCollection(
() -> new TreeSet<>(Comparator.comparing(o -> o.getSkuNo()))),
ArrayList::new));
方法二 map 去重
public static void main(String[] args) {
List<GoodInfo> goodInfos = Arrays.asList();
goodInfos.add(new GoodInfo("tb", "tb_1112312312", 199, 100000));
goodInfos.add(new GoodInfo("tb", "tb_23534231231", 399, 10));
goodInfos.add(new GoodInfo("jd", "jd_1110080098", 299, 100));
goodInfos.add(new GoodInfo("jd", "jd_1110080098", 299, 100));
goodInfos.add(new GoodInfo("jd", "jd_412313123", 99, 10000000));
goodInfos.add(new GoodInfo("pdd", "pdd_354532431", 599, 1));
goodInfos.add(new GoodInfo("pdd", "pdd_1423124131", 499, 10));
// 使用map去重
List<GoodInfo> goodInfos2 =
goodInfos.stream()
.filter(distinctByKey(goodInfo -> goodInfo.getSkuNo()))
.collect(Collectors.toList());
}
public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
Map<Object, Boolean> seen = new ConcurrentHashMap<>();
return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}
遇到的坑
坑一
-
報錯資訊:
java.util.NoSuchElementException: No value present -
解決方案:
一般出現這個錯都是在filter操作后面使用了max/min等操作,然后呼叫了get方法,取不到資料,導致報錯,所以建議檢查filter操作后時候還有資料,有資料再進行后續操作:
Optional<User> optional = goodInfos.stream().max(userComparator);
if(optional != null && optional.isPresent()) {
recentUserServer = optional.get().getServer();
}
坑二
- 使用了filter為什么沒起作用呢?
呼叫filter之后,它是有回傳值的,所以你需要使用新的集合去接收
,,,
后續慢慢填坑
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/256318.html
標籤:AI
