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

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

唐向荣
2023-03-14

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

我有一个简单的类叫做“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的公共房屋。

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

下面的测试类包含两个测试,第一个测试应该为每个循环使用一个传统的,并迭代房屋列表,产生两个列表,一个包含私有房屋,另一个包含公共房屋或带有会话ID的房屋。

第二个测试应该SeperateWhetherHouse IsPrivate是我使用流的最初尝试,此时测试在第二个断言上失败,因为分区根据逻辑只分裂房屋对象是否是私有的,因此是没有会话的公共房屋最终被添加到另一个列表,通过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());
}

}

所以如果谓语p-

非常感谢您的帮助!


共有1个答案

龙高歌
2023-03-14

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

试试这个。。。

Map<Boolean, List<House>> segregatedHouses = houses.stream()
        .filter(p -> p.isPrivate() || p.hasSessionId())
        .collect(Collectors.partitioningBy(p -> p.isPrivate()))
 类似资料:
  • 问题基于https://stackoverflow.com/A/29671501/2517622 有办法吗?

  • 我可以使用db2分区特性来满足上述需求吗?。如何使用last_updated_date列和高于两个some_indicator值对表进行分区?一个分区应该包含按月删除标准的记录,而其他分区应该包含按年删除标准的记录。如果这个表被频繁地读取或更新,那么是否存在与表分区相关的性能问题?以上要求的任何其他最佳实践肯定会有所帮助。

  • 问题内容: 我目前已经实现了一个动态查询构建器,如果我的查询条件拼写正确,该构建器可以完美地工作。由于可能并非总是如此,因此我需要一个足够灵活的解决方案,以适应条件的任何变化,主要是支持不区分大小写。 当前规范的toPredicate方法覆盖代码如下所示: 从服务层调用的我的存储库接口如下所示。 谢谢您的帮助 问题答案: 通常,您可以使用equalsIgnoreCase()方法实现不区分大小写的功

  • 我正在尝试根据买入或卖出方向对股票订单列表进行排序。 我试过这样的方法: 我看到下面的错误消息,我不清楚。 不兼容的类型。必需的int,但已将“comparing”推断给Comparator:不存在类型变量T,U的实例,因此Comparator符合Integer。

  • 我收集了< code > 我想找到“每种类型中的一种”,尽管我想找到产品集合中每个谓词的第一个匹配项。 目前我的代码如下: 但这当然会多次迭代产品集合,这是不需要的,因为在我的例子中,我有100000个产品和64个谓词,并且需要很长时间。 在我的特例中,谓词是互斥的:如果一个谓词返回true,那么对于该特定产品,所有其他谓词都可以跳过。因为我使用了< code>findFirst,所以对于所有其他