工作中使用过与stream流相关的API操作

Posted 默辨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了工作中使用过与stream流相关的API操作相关的知识,希望对你有一定的参考价值。

简单记录工作中使用过与stream流相关的API操作

文章目录


一、List

1、合并list<map>中的key-value数据
public static Map<String, String> mergeMap(List<Map<String, String>> dataList) 

    return dataList.stream()
            .map(Map::entrySet)
            .flatMap(Set::stream)
            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));



2、按单个key进行分组
List<Integer> numberList = Arrays.asList(3, 5, 6, 4, 2, 8, 9, 1, 7);

//使用stream流进行分组(使用条件)
Map<Boolean, List<Integer>> splitMap = numberList
    .stream()
    .collect(Collectors.groupingBy(number -> number < 5));

// 满足条件的一组
List<Integer> trueList = splitMap.get(true);
// 不满足条件的一组
List<Integer> falseList = splitMap.get(false);



3、按照对象(BookEntry)指定属性进行分组
List<BookEntry> newEntryList = groupBookEntryList(entryList)


private List<BookEntry> groupBookEntryList(List<BookEntry> oldEntryList) 

	// 按照指定列进行分组
    Map<String, List<BookEntry>> afterGroupEntryList = oldEntryList.stream()
            .collect(Collectors.groupingBy(AcctTotalCon::fetchGroupKey));

	// 将分组后的数据重新处理
    afterGroupEntryList.forEach((key, value) -> 
        BookEntry newEntry = new BookEntry();
        String[] split = key.split("\\\\|", -1);
        newEntry.setOrgId(split[0]);
        newEntry.setCode(split[1]);
        newEntry.setCur(split[2]);

        // 分组中所有的金额相加为一组
        AtomicReference<Double> amt = new AtomicReference<>(0D);
        value.forEach(entry -> 
            // 红字,增加负数
            Double t = entry.getValue();
            amt.set(CalculatorUtil.add(amt.get(), t));

        );
        newEntry.setValue(amt.get());

        retEntryList.add(newEntry);
    );



// 按照orgId、code、cur三个属性进行分组
private static String fetchGroupKey(BookEntry entry) 
    return entry.getOrgId() + "|" + entry.getCode() + "|"
            + entry.getCur();




二、Map

1、Map<String, String> --> Map<String, Object>
public static Map<String, Object> strMapToObjMap(Map<String, String> stringMap) 
    return stringMap.entrySet()
            .stream()
            .collect(Collectors.toMap(Map.Entry::getKey, entry -> (Object) entry.getValue()));



2、对map指定K或者V进行排序
Map<String, Integer> testMap = Maps.newHashMap();
testMap.put("g", 2);
testMap.put("b", 1);
testMap.put("c", 2);
testMap.put("a", 9);
testMap.put("k", 3);
Map<String, Integer> keySortMap = new LinkedHashMap<>();
Map<String, Integer> valueSortMap = new LinkedHashMap<>();

testMap.entrySet().stream()
        .sorted(Map.Entry.comparingByKey())
        .forEachOrdered(item -> keySortMap.put(item.getKey(), item.getValue()));


testMap.entrySet().stream()
        .sorted(Map.Entry.comparingByValue())
        .forEachOrdered(item -> valueSortMap.put(item.getKey(), item.getValue()));


以上是关于工作中使用过与stream流相关的API操作的主要内容,如果未能解决你的问题,请参考以下文章

Java8 Stream流API常用操作

stream api 流式编程

模型绑定不适用于 asp.net 核心 Web api 控制器操作方法中的 Stream 类型参数。(即使使用自定义流输入格式化程序)

java8 函数式编程入门官方文档中文版 java.util.stream 中文版 流处理的相关概念

Stream流体系

Java8 Stream 流API总结