当前位置: 首页 > 知识库问答 >
问题:

如何从Java8中的对象流中获取公共项

史洛城
2023-03-14

我有两个Coll对象流,我想在实例变量sayI的基础上找到公共对象。我需要使用Java8流来实现这一点。此外,我需要更新j变量,比如说公共元素的乘数为1000。

class Coll
{
Integer i;
Integer j;

public Coll(Integer i, Integer j) {
    this.i = i;
    this.j = j;
}

public Integer getI() {
    return i;
}

public void setI(Integer i) {
    this.i = i;
}

public Integer getJ() {
    return j;
}

public void setJ(Integer j) {
    this.j = j;
}

}

我在写一些东西,比如:

 public static void main(String args[])
{
    Stream<Coll> stream1 = Stream.of(new Coll(1,10),new Coll(2,20),new Coll(3,30) );
    Stream<Coll> stream2 = Stream.of(new Coll(2,20),new Coll(3,30),new Coll(4,40) );

    Stream<Coll> common = stream1
            .filter(stream2
                    .map(x->x.getI())
                    .collect(Collectors.toList())
                    ::equals(stream2
                                .map(x->x.getI()))
                                .collect(Collectors.toList()));
    common.forEach( x-> x.setJ(x.getJ()*1000));
    common.forEach(x -> System.out.println(x));

}

我在这个方法上做错了!!我猜Java8不支持像equals那样带有参数的方法!!

我收到一个编译错误:应为“')”或“;” 环绕等于方法


共有2个答案

狄信然
2023-03-14

移动逻辑以收集Stream2外部的所有i。然后过滤stream1中的所有Coll,如果另一个列表中存在i

List<Integer> secondCollStreamI = stream2
            .map(Coll::getI)
            .collect(Collectors.toList());
Stream<Coll> common = stream1
            .filter(coll -> secondCollStreamI.contains(coll.getI()));


common.forEach( x-> x.setJ(x.getJ()*1000));
common.forEach(x -> System.out.println(x));

最后一条语句将导致IllegalStateExcema流已被操作或关闭),因为您不能重用流。你需要在某个地方把它收集到一个List

List<Coll> common = stream1
            .filter(coll -> secondCollStreamI.contains(coll.getI()))
            .collect(Collectors.toList());

common.forEach(x -> x.setJ(x.getJ() * 1000));
common.forEach(System.out::println);

或者,如果你想在不收集的情况下快速完成所有事情

stream1
        .filter(coll -> secondCollStreamI.contains(coll.getI()))
        .forEach(x->  {
            x.setJ(x.getJ()*1000);
            System.out.println(x);
        });

莫宝
2023-03-14

你可以这样做,

Map<Integer, Coll> colsByI = listTwo.stream()
    .collect(Collectors.toMap(Coll::getI, Function.identity()));
List<Coll> commonElements = listOne.stream()
    .filter(c -> Objects.nonNull(colsByI.get(c.getI())) && c.getI().equals(colsByI.get(c.getI()).getI()))
    .map(c -> new Coll(c.getI(), c.getJ() * 1000))
    .collect(Collectors.toList());
 类似资料:
  • 问题内容: 可以说我有一个单词列表,我想创建一个将新列表的大小作为参数并返回新列表的方法。我如何从原始sourceList中获得随机单词? 那么,如何以及在哪里可以使用我的随机数? 问题答案: 我找到了适当的解决方案。Random提供了一些返回流的方法。例如ints(size)会创建一个随机整数流。

  • 我有一个对象列表(文件夹)。该列表中的每个对象A都有一个对象B(合作伙伴)列表,对象B也有一个对象C(人员)列表。对象C包含一个属性代码,我想用它来使用Java8进行过滤。 我试过下面的代码,但它似乎不工作: 你们知道我如何使用FlatMap从

  • 问题内容: 我正在开发一个需要借助(NIST P-256,P-256,prime256v1)公钥来验证签名的应用程序。 公钥是由其他应用程序在较早的时间点生成的,并以十六进制编码存储在我的数据库中。十六进制字符串的格式等效于OpenSSL在调用以前由生成的文件时将生成的十六进制字符串。消息和签名是从其他应用程序接收的。考虑以下测试数据: 现在,这 应该 是有效的签名。 我的目标是使用Java和/或

  • 我正在开发一个应用程序,它需要在(NIST P-256,P-256,prime256v1)公钥的帮助下验证签名。 公钥是由一个不同的应用程序在较早的时间点生成的,并以十六进制编码存储在我的数据库中。这里的十六进制字符串的格式等效于OpenSSL在调用时生成的十六进制字符串,该文件以前是由生成的。消息和签名是从不同的应用程序接收的。考虑以下测试数据: 现在这应该是一个有效的签名。 我的目标是使用Ja

  • 我是Javascript新手,我正试图从包含多个对象的数组中获取id键的值。 通过 for..在循环中,我需要对象的id - 如1,2或3 - 与不同的值进行比较。 我试着这样做: 但是,我这样做了,删除Id值返回未定义。 我想不通为什么返回未定义,我无法解决这个问题。 我希望我能很好地表达自己,对不起我的英语不好。