gpt4 book ai didi

Java 8 stream partitioningBy 假条件下的第二个谓词

转载 作者:行者123 更新时间:2023-11-29 05:05:45 25 4
gpt4 key购买 nike

我最近一直在我的代码中尽可能多地使用流,但我遇到了一个我还没有完全解决的问题。

我有一个名为“Listing”的简单类:

package models;

public class House {

private boolean isPrivate;
private Integer views;
private boolean hasSessionId;

public Listing(boolean isPrivate, Integer views, boolean hasSessionId) {
this.isPrivate = isPrivate;
this.views = views;
this.hasSessionId = hasSessionId;
}

public boolean hasSessionId() {
return hasSessionId;
}

public boolean isPublic() {
return !isPrivate;
}

public boolean isPrivate() {
return isPrivate;
}

public Integer getViews() {
return views;
}

}

我有一个房屋列表,我想在其中生成一个包含两个列表的 map ,这些列表的房屋通过特定条件隔离,我希望一个列表包含私有(private)房屋,无论它们是否有 session ID,另一个列表包含公共(public)房屋具有 session ID 的房屋。

使用传统循环我可以实现我想要的功能,但我希望能够将其转换为使用流。

下面的测试类包含两个测试,第一个测试shouldProduceTwoListsWithOneElementEach使用传统的 for each 循环并迭代房屋列表并生成两个列表,一个包含 privateHouses,另一个包含公共(public)房屋或具有 sessionId 的房屋。

第二次测试shouldSeperateWhetherHouseIsPrivate是我最初尝试使用流,目前测试在第二个断言上失败,因为 partitioningBy 逻辑只是 split 房屋对象是否是私有(private)的,因此没有会​​话的公共(public)房屋最终被添加到另一个列表,通过 segregatedHouses.get(false) 访问。

package models;

import static org.junit.Assert.assertEquals;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import org.junit.Before;
import org.junit.Test;

public class ListingsTest {

private List<House> houses;

@Before
public void setUp() {
House publicListingWithSession = new House(false, 1, true);
House privateListingWithoutSession = new House(true, 1, false);
House publicListingWithNoViewsWithoutSession = new House(false, 0, false);

this.houses = new ArrayList<House>();
this.houses.add(publicListingWithSession);
this.houses.add(privateListingWithoutSession);
this.houses.add(publicListingWithNoViewsWithoutSession);
}

@Test
public void shouldProduceTwoListsWithOneElementEach() {
List<House> privateHouses = new ArrayList<House>();
List<House> publicHousesOrHasSessionId = new ArrayList<House>();

for (House listing : houses) {
if (listing.isPrivate()) {
privateHouses.add(listing);
} else if (listing.getViews() > 0 || listing.hasSessionId()) {
publicHousesOrHasSessionId.add(listing);
}
}
assertEquals(1, privateHouses.size());
assertEquals(1, publicHousesOrHasSessionId.size());
}

@Test
public void shouldSeperateWhetherHouseIsPrivate() {
Map<Boolean, List<House>> segregatedHouses = houses.stream()//
.collect(Collectors.partitioningBy(p -> p.isPrivate()));

assertEquals(1, segregatedHouses.get(true).size());
assertEquals(1, segregatedHouses.get(false).size());
}

}

所以 if 谓词 p -> p.isPrivate()计算结果为真然后 House对象被添加到 Map<Boolean, List<House>> segregatedHouses可以通过 segregatedHouses.get(true) 访问.如果谓词的计算结果为假,则 House被添加到另一个列表中,有没有办法在将众议院添加到将通过 segregatedHouses.get(false) 访问的列表之前再次评估众议院? ?

非常感谢任何帮助!

最佳答案

我相信第二部分,您只需要私有(private)房屋或公共(public)房屋并将 hasSessionId 划分为 2 个列表。

试试这个……

Map<Boolean, List<House>> segregatedHouses = houses.stream()
.filter(p -> p.isPrivate() || p.hasSessionId())
.collect(Collectors.partitioningBy(p -> p.isPrivate()))

关于Java 8 stream partitioningBy 假条件下的第二个谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30417033/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com