Java 8流分区(基于假条件的第二个谓词)

Java 8流分区(基于假条件的第二个谓词),java,java-8,java-stream,Java,Java 8,Java Stream,我最近在我的代码中尽可能多地使用流,但我遇到了一个我还不能完全解决的问题 我有一个简单的类叫做“Listing”: package models; public class House { private boolean isPrivate; private Integer views; private boolean hasSessionId; public Listing(boolean isPrivate, Integer views, boolean hasSessionId) {

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

我有一个简单的类叫做“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;
}

}
我有一个房屋列表,我想在其中生成一个包含两个列表的地图,其中房屋根据特定条件被隔离,我想一个列表包含私人房屋,无论它们是否具有会话id,另一个列表包含具有会话id的公共房屋

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

下面的测试类包含两个测试,第一个测试
shouldProduceTwoListThonelementeach
使用传统的for-each循环并迭代房屋列表并生成两个列表,一个包含私人房屋,另一个包含公共房屋或带有sessionId的房屋

第二个测试
应该区分house IsPrivate
是否是我使用streams的初始尝试,此时测试在第二个断言中失败,因为Partitioning By逻辑只是根据house对象是否是私有的来划分,因此没有会话的公共场所最终被添加到另一个列表中,通过隔离的dhouses.get访问(false)

封装模型;
导入静态org.junit.Assert.assertEquals;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.Map;
导入java.util.stream.collector;
导入org.junit.Before;
导入org.junit.Test;
公共类列表测试{
私人上市公司;
@以前
公共作废设置(){
House publicListingWithSession=新房子(假,1,真);
房屋专有权不包括在内=新房屋(真、1、假);
房屋公共列表WithNoviewsWithOutsession=新房屋(假,0,假);
this.houses=new ArrayList();
this.houses.add(publicListingWithSession);
此.houses.add(不含session的私有化);
this.houses.add(publicationlistingwithnoviewswithoutsession);
}
@试验
public void应生成两个列表,其中一个列表为Thonelementeach(){
List privateHouses=new ArrayList();
List publicHousesOrHasSessionId=new ArrayList();
用于(房屋清单:房屋){
if(listing.isPrivate()){
私人住宅。添加(列表);
}else if(listing.getViews()>0 | | listing.hasSessionId()){
publichhousesorhassessionid.add(列表);
}
}
assertEquals(1,privateHouses.size());
assertEquals(1,Publichouse或HassSessionId.size());
}
@试验
公共空间应该分开,无论房子是私人的{
Map dehouse=houses.stream()//
.collect(收集器.partitionby(p->p.isPrivate());
assertEquals(1,separatedhouse.get(true.size());
assertEquals(1,separatedhouse.get(false.size());
}
}
因此,如果谓词
p->p.isPrivate()
的计算结果为true,则
House
对象将添加到
Map separatedhouse
,该对象可通过
separatedhouse.get(true)
访问。如果谓词的计算结果为false,则
房屋
将添加到另一个列表中,是否有方法在房屋添加到将通过
separatedhouse.get(false)
访问的列表之前再次计算房屋


非常感谢您的帮助

我相信在第二部分中,你只希望房子是私人的或者是公共的,并且被分成两个列表

试试这个

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

Hi Harsh,这里的问题是我想收集任何私人住宅,无论它们是否有sessionId,但公共住宅必须有会话id,因此过滤器意味着在上面的测试中,私人住宅将不会被添加,因为它没有sessionId。@ScalabilitysResolved我已更新了答案。我相信这会解决你的问题
Map<Boolean, List<House>> segregatedHouses = houses.stream()
        .filter(p -> p.isPrivate() || p.hasSessionId())
        .collect(Collectors.partitioningBy(p -> p.isPrivate()))