按谓词对集合进行分区的库方法

2022-09-01 14:14:49

我有一个对象集合,我想将它们划分为两个集合,其中一个传递谓词,另一个传递谓词失败。我希望有一种番石榴方法可以做到这一点,但是最接近的是过滤器,这不会给我其他系列。

我会想象该方法的签名是这样的:

public static <E> Pair<Collection<E>, Collection<E>> partition(Collection<E> source, Predicate<? super E> predicate)

我意识到这对于我自己编写代码非常快,但我正在寻找一种现有的库方法,可以完成我想要的。


答案 1

使用番石榴的Multimaps.index

下面是一个示例,它将单词列表分为两部分:长度> 3 的单词和长度不长度为 3 的部分。

List<String> words = Arrays.asList("foo", "bar", "hello", "world");

ImmutableListMultimap<Boolean, String> partitionedMap = Multimaps.index(words, new Function<String, Boolean>(){
    @Override
    public Boolean apply(String input) {
        return input.length() > 3;
    }
});
System.out.println(partitionedMap);

指纹:

false=[foo, bar], true=[hello, world]

答案 2

使用新的java 8功能(lambda抑制),您可以编写:

List<String> words = Arrays.asList("foo", "bar", "hello", "world");

Map<Boolean, List<String>> partitionedMap =
        words.stream().collect(
                Collectors.partitioningBy(word -> word.length() > 3));

System.out.println(partitionedMap);