【发布时间】:2018-07-13 18:29:30
【问题描述】:
假设我有这两个列表
List<Person> persons = Arrays.asList(
new Person(1, "Mike", "Canada"),
new Person(2, "Jill", "England"),
new Person(3, "Will", "Whales"),
new Person(4, "Mary", "Spain"));
List<Metadata> metadata= Arrays.asList(
new metadata(1, "2000-01-01", "Naturalized", "Bachelor's of Arts"),
new metadata(2, "2001-01-01", "ExPat", "Masters of Chemestry"),
new metadata(3, "2017-05-01", "Citizen", "Buiness Management"),
new metadata(4, "2018-04-16", "Work Visa", "Nursing"));
最终结果是一个新列表:
List<PersonWithMetadata> personsAndMEtadata = Arrays.asList(
new PersonWithMetadata(1, "Mike", "Canada", "2000-01-01", "Naturalized", "Bachelor's of Arts"),
new PersonWithMetadata(2, "Jill", "England", "2001-01-01", "ExPat", "Masters of Chemestry"),
new PersonWithMetadata(3, "Will", "Whales", "2017-05-01", "Citizen", "Buiness Management"),
new PersonWithMetadata(4, "Mary", "Spain", "2018-04-16", "Work Visa", "Nursing"));
我正在尝试找到一种 Java 流方式将前两个列表组合到第三个列表中——就像第一个输入上的 SQL 连接是一个 ID 号。似乎应该有办法做到这一点,但我不知所措。这是怎么做的?此外,假设两个输入列表之间最多有一个匹配项。
【问题讨论】:
-
他们遵循相同的顺序吗?
-
你有没有特别尝试过,但失败了?您必须使用流有什么特别的原因吗?
-
尝试从 IntSream.range 开始并以这种方式遍历索引。这段代码有“设计气味”,考虑适当的数据结构。如果您使用地图会更好,这样您就可以通过 id 进行查找。将该ID的所有相关信息存储在适当的类中。而不是平行列表。
-
我首先发布了一个答案,显示了 Guava
Streams.zip的示例,但后来在此答案中找到:Google Guava “zip” two lists。另一个更一般的答案:How to zip two Java Lists我删除了我的答案,但想提及链接的答案。
标签: java java-8 java-stream