亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何從 Java8 中的對象流中獲取公共項

如何從 Java8 中的對象流中獲取公共項

慕絲7291255 2021-06-30 13:19:47
我有 2 個 Coll 對象流,我想根據實例變量i在這里說的一個來查找公共對象。我需要使用 Java 8 流來做到這一點。此外,我需要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));}我在 equals 方法周圍做錯了什么!!我猜 Java8 不支持像 equals 這樣的帶參數的方法??!我收到一個編譯錯誤:expected a ')' or ';'圍繞 equals 方法
查看完整描述

2 回答

?
慕尼黑的夜晚無繁華

TA貢獻1864條經驗 獲得超6個贊

你可以這樣做,


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());


查看完整回答
反對 回復 2021-07-07
?
開滿天機

TA貢獻1786條經驗 獲得超13個贊

將邏輯移到i外面收集Stream2 的所有內容。然后過濾流1中的所有內容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));

最后一條語句將產生IllegalStateException( stream has already been operated upon or closed),因為您不能重用該流。你需要在某個地方把它收集到一個List<Coll>......像......


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);

        });


查看完整回答
反對 回復 2021-07-07
  • 2 回答
  • 0 關注
  • 221 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號