Java 将arraylist划分为映射桶

Java 将arraylist划分为映射桶,java,lambda,java-8,Java,Lambda,Java 8,我有两个类型为StringArrayList xList和ArrayList yList的ArrayList,我想根据someAttribute将一个列表划分为bucket(对于下面的示例,假设它使用.contains() Map yBuckets=newhashmap(); yList.forEach(y->yBuckets.compute(y.contains(“我在这里”),(k,v)-> (v==null?新建ArrayList():v).add(y)); 然而,我得到了一个不兼容的类

我有两个类型为String
ArrayList xList
ArrayList yList
的ArrayList,我想根据someAttribute将一个列表划分为bucket(对于下面的示例,假设它使用.contains()

Map yBuckets=newhashmap();
yList.forEach(y->yBuckets.compute(y.contains(“我在这里”),(k,v)->
(v==null?新建ArrayList():v).add(y));
然而,我得到了一个不兼容的类型错误(字符串不能转换为布尔值)。到目前为止,我从未真正使用过Java 8,但它似乎对我想要的东西很有用,所以我想知道是否有人能告诉我如何修复这段代码。
谢谢

您的代码中有两个错误。第一个错误是,如果您想基于
进行分区,那么包含
将返回
布尔值
,您的映射需要是
映射

第二个错误是括号。
(k,v)->……
lambda需要返回
List
,因为您将
。add(y)
放在lambda中,它返回一个
布尔值,您需要将它添加到
compute
返回的列表中,如下所示:

yList.forEach(y -> yBuckets.compute(y.contains("I'm here"), (k,v) ->
(v == null ? new ArrayList<>() : v)).add(y));
yList.forEach(y->yBuckets.compute(y.contains(“我在这里”),(k,v)->
(v==null?新建ArrayList():v)).add(y));

如果要使用lambda,可以使用一个toMap收集器:

例如,按姓氏将名称列表划分为存储桶:

    List<String> names = Arrays.asList("Steve Ray", "Bobby Ray", "Billy Bob", "Timmy Bob");
    Map<String, List<String>> nameBuckets = names.stream().collect(
            Collectors.groupingBy(str -> {return str.split(" ")[1];}, Collectors.toList()));
List name=Arrays.asList(“史蒂夫•雷”、“鲍比•雷”、“比利•鲍勃”、“蒂米•鲍勃”);
Map NameBucket=names.stream().collect(
Collectors.groupby(str->{return str.split(“”[1];},Collectors.toList());

对于您提供的示例,有
收集器。Partitioning By
,但这将仅在
两部分中进行分区-基于
谓词

yList.stream()
            .collect(Collectors.partitioningBy(y -> y.contains("I'm here")));
因此,这将以
Map
的形式出现


如果您有更多的组,您可能希望使用
收集器。groupingBy
根据
函数划分您的列表

您可以提供一个输入和输出数据方面的示例吗?
映射。compute
将键作为第一个参数。在您的情况下,它将是
字符串
,但
y.contains
返回布尔值。“放入存储桶”。嗯,值来自
yList
,这些值在映射中有哪些键?给出代码示例很好,但如果您也给出示例输入和预期结果,以更好地说明您的描述,则会非常有帮助。关于您的问题,有几个问题……首先,为什么您在创建时说您有两个列表你只关心一个吗?那么你的例子将是“分区”只有两个逻辑部分-
false
:List和
true
List
这样做,有一个更简单的方法。它不会编译。@Aominè直接从运行中的程序复制,所以您的声明是假的。@Aominè它编译并正确运行,无论您看到什么错误。@Aominè
布尔键
如果OP想要基于
进行分区。包含
则该键必须是布尔键,正如我在回答开头所说。这是否是OP想要的,我不知道,但OP正在使用字符串作为其当前示例的键。这个问题可能需要澄清,但只是想指出它。
yList.stream()
            .collect(Collectors.partitioningBy(y -> y.contains("I'm here")));