java8 stream用法收集(后续一直更行)

1 篇文章 0 订阅
1 篇文章 0 订阅
// 集合1  
        List<SkillUpgrade> lists = new ArrayList<>();  
        SkillUpgrade s = new SkillUpgrade();  
        s.setLv(1);  
        s.setAppearNum(100);  
        lists.add(s);  
        SkillUpgrade s2 = new SkillUpgrade();  
        s2.setLv(2);  
        s2.setAppearNum(200);  
        lists.add(s2);  
        // 集合1  
        List<SkillUpgrade> listx = new ArrayList<>();  
        SkillUpgrade x = new SkillUpgrade();  
        x.setLv(1);  
        x.setSelectNum(1100);  
        listx.add(x);  
        SkillUpgrade x2 = new SkillUpgrade();  
        x2.setLv(2);  
        x2.setSelectNum(1200);  
        listx.add(x2);  
        // 把list转map,{k=lv,vaule=并为自身}  . SkillUpgrade->SkillUpgrade或Function.identity()  
        Map<Integer, SkillUpgrade> map = listx.stream()  
                .collect(Collectors.toMap(SkillUpgrade::getLv, SkillUpgrade -> SkillUpgrade));  
        System.out.println("map:="+map);  
        // 合并  
        lists.forEach(n -> {  
            // 如果等级一致  
            if (map.containsKey(n.getLv())) {  
                SkillUpgrade obj = map.get(n.getLv());  
                // 把数量复制过去  
                n.setSelectNum(obj.getSelectNum());  
            }  
        });  
        System.out.println("lists:="+lists);  
        // 重复问题  
        Map<Integer, SkillUpgrade> keyRedo = listx.stream()  
                .collect(Collectors.toMap(SkillUpgrade::getLv, Function.identity(), (key1, key2) -> key2));  
        // 方式二:指定实例的map  
        Map<Integer, SkillUpgrade> linkedHashMap = listx.stream().collect(Collectors.toMap(SkillUpgrade::getLv,  
                SkillUpgrade -> SkillUpgrade, (key1, key2) -> key2, LinkedHashMap::new));  
    }  

 

实现List<Data1>和List<Data2>根据Id进行连接,将连接结果输出为一个List<OutputData>:

List<Data2> listOfData2 = new ArrayList<Data2>();

    listOfData2.add(new Data2(10501, "JOE"  , "Type1"));
    listOfData2.add(new Data2(10603, "SAL"  , "Type5"));
    listOfData2.add(new Data2(40514, "PETER", "Type4"));
    listOfData2.add(new Data2(59562, "JIM"  , "Type2"));
    listOfData2.add(new Data2(29415, "BOB"  , "Type1"));
    listOfData2.add(new Data2(61812, "JOE"  , "Type9"));
    listOfData2.add(new Data2(98432, "JOE"  , "Type7"));
    listOfData2.add(new Data2(62556, "JEFF" , "Type1"));
    listOfData2.add(new Data2(10599, "TOM"  , "Type4"));


    List<Data1> listOfData1 = new ArrayList<Data1>();

    listOfData1.add(new Data1(10501, "JOE"    ,3000000));
    listOfData1.add(new Data1(10603, "SAL"    ,6225000));
    listOfData1.add(new Data1(40514, "PETER"  ,2005000));
    listOfData1.add(new Data1(59562, "JIM"    ,3000000));
    listOfData1.add(new Data1(29415, "BOB"    ,3000000));

    List<OutputData> result = listOfData1.stream()
            .flatMap(x -> listOfData2.stream()
                    .filter(y -> x.getId() == y.getId())
                    .map(y -> new OutputData(y.getId(), x.getName(), y.getType(), x.getAmount())))
            .collect(Collectors.toList());
    System.out.println(result);

    /*difference by key*/
    List<Data1> data1IntersectResult = listOfData1.stream().filter(data1 -> listOfData2.stream().map(Data2::getId).collect(Collectors.toList()).contains(data1.getId())).collect(Collectors.toList());
    System.out.println(data1IntersectResult);

 

Map<Integer, ListContainer> map = Maps.newHashMap();
    List<AClass> aClassList1 = Lists.newArrayList();
    AClass aClass = new AClass(1, "zhuoli1", "haha1");
    aClassList1.add(aClass);
    aClassList1.add(new AClass(2, "zhuoli2", "haha2"));
    aClassList1.add(new AClass(3, "zhuoli3", "haha3"));

    List<AClass> aClassList2 = Lists.newArrayList();
    aClassList2.add(aClass);
    aClassList2.add(new AClass(5, "zhuoli5", "haha5"));
    aClassList2.add(new AClass(6, "zhuoli6", "haha6"));

    /*交集*/
    /*[AClass(id=1, name=zhuoli1, description=haha1)]*/
    List<AClass> intersectResult = aClassList1.stream().filter(aClassList2::contains).collect(Collectors.toList());
    System.out.println(intersectResult);

    /*并集*/
    List<AClass> unionResult = Stream.of(aClassList1, aClassList2).flatMap(Collection::stream).distinct().collect(Collectors.toList());
    assertEquals(unionResult.size(), 5);
    System.out.println(unionResult);

    /*差集*/
    /*[AClass(id=2, name=zhuoli2, description=haha2), AClass(id=3, name=zhuoli3, description=haha3)]*/
    List<AClass> differenceResult = aClassList1.stream().filter(x -> !aClassList2.contains(x)).collect(Collectors.toList());
    System.out.println(differenceResult);

    map.put(1, new ListContainer(aClassList1));
    map.put(2, new ListContainer(aClassList2));

    /*合并多个list*/
    List<AClass> aClassListResult = map.values().stream().flatMap(listContainer -> listContainer.getLst().stream()).collect(Collectors.toList());
    /*注意跟并集的区别*/
    assertEquals(aClassListResult.size(), 6);
    System.out.println(aClassListResult);

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java 8 中的 Stream API 可以使用 `map()` 和 `flatMap()` 方法来进行树型查询。 `map()` 方法可以将一个对象转换为另一个对象,而 `flatMap()` 方法则可以将一个对象转换为一个流,并将多个流合并成一个流。 例如,假设你有一个类 `Employee` 和一个类 `Department`,其中员工对象包含一个 `department` 字段,表示员工所在的部门。你可以使用 `flatMap()` 方法来获取每个部门中的所有员工: ``` List<Employee> employees = ...; List<Employee> result = departments.stream() .flatMap(department -> department.getEmployees().stream()) .collect(Collectors.toList()); ``` 你也可以使用 `map()` 方法来获取员工所在部门的名称: ``` List<String> result = employees.stream() .map(employee -> employee.getDepartment().getName()) .collect(Collectors.toList()); ``` 希望这对你有帮助! ### 回答2: 在Java 8中,Stream提供了一种强大的功能来进行树型查询。树型查询是指对一棵树进行搜索、过滤和转换等操作。下面是一个简单的示例来说明如何使用Stream进行树型查询。 假设我们有一个对象类型为Node的树结构,其中每个节点包含一个值和一个子节点列表。我们希望从这个树结构中查询所有符合条件的节点,并返回一个新的树结构。 首先,我们可以通过使用递归函数来遍历整个树结构。在每个节点上,我们可以通过调用Stream的filter()方法来过滤出满足条件的节点。然后,我们可以使用Stream的map()方法来对过滤出的节点进行转换,例如将节点的值进行修改。 下面是一个伪代码示例: ``` public Stream<Node> searchTree(Node currentNode) { Stream<Node> stream = Stream.of(currentNode); if (currentNode.hasChildren()) { stream = Stream.concat(stream, currentNode.getChildren().stream().flatMap(this::searchTree)); } return stream.filter(node -> node.getValue() > 10).map(node -> new Node(node.getValue() * 2)); } ``` 在这个示例中,我们创建了一个递归函数searchTree(),它接受一个当前节点作为参数。我们首先将当前节点转换为一个Stream对象,并进行过滤操作,只保留节点值大于10的节点。然后,我们将此节点的子节点列表转换为一个新的Stream对象,并通过调用flatMap()方法将它们连接到当前节点的Stream对象中。最后,我们对过滤出的节点进行映射操作,将节点的值乘以2,然后创建一个新的Node对象。 通过这种方式,我们可以构建出一个新的树结构,其中只包含满足条件的节点,并对节点的值进行了修改。这种方法利用了Stream的强大功能,并且可以通过简洁的代码来实现复杂的树型查询操作。 ### 回答3: Java 8引入的Stream API为我们提供了一种便捷而强大的方式来进行树型查询操作。在树型查询中,我们可以针对一个树状结构进行查询,并根据一定的条件对节点进行过滤、排序和映射等操作。 首先,我们可以使用Stream的filter方法来筛选出符合条件的节点。例如,我们可以筛选出树中所有年龄大于18岁的节点。 然后,我们可以使用Stream的sorted方法对节点进行排序。例如,我们可以根据节点的某个属性进行排序,比如按照节点的名称按字母顺序进行排序。 接下来,我们可以使用Stream的map方法对节点进行映射。例如,我们可以将树中的每个节点的名称映射为大写形式。 此外,我们还可以使用Stream的flatMap方法对树进行扁平化处理。例如,如果树的每个节点还包含一个子树,我们可以使用flatMap方法将所有的子树合并成一个结果流。 最后,我们可以使用Stream的collect方法将查询结果收集到一个集合中。例如,我们可以将查询结果收集到一个List或者Map中,以便后续进行处理。 总结来说,Java 8的Stream API为我们提供了一种便捷而强大的方式来进行树型查询操作。我们可以使用filter、sorted、map、flatMap和collect等方法对节点进行筛选、排序、映射、扁平化和收集操作,以便对树进行灵活的操作和分析。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值