【发布时间】:2018-08-14 07:34:18
【问题描述】:
我有一个以下模式的字符串列表
String test ="name=john,age=28;name=paul,age=30;name=adam,age=50";
List<String> listOfStrings = Arrays.asList(test.split(";"));
我想将上面的字符串列表转换为键值对映射列表(如下所示)。
[{name=john, age=28}, {name=paul, age=30}, {name=adam, age=50}]
上面的每个条目都列出了一个映射,其中键作为名称和年龄,值作为它们的对应值。
这就是我为实现结果所做的工作。
listOfStrings.stream()
.map(record -> Arrays.asList(record.split(",")).stream().map(field -> field.split("="))
.collect(Collectors.toMap(keyValue -> keyValue[0].trim(), keyValue -> keyValue[1].trim())))
.collect(Collectors.toList());
我想知道这是否有效,或者是否有更好的方法来使用 Java 流。
【问题讨论】:
-
当你真正使用
Arrays.asList(test.split(";"));时,使用 Java 流是没有意义的,它已经全部在内存中,你可以迭代数组并手动构建映射 -
您为什么要为此使用地图?一张地图意味着一把钥匙,一个年龄不是一把钥匙。此外,为什么要使用年龄?为什么不使用birthDate?
-
@Stultuske,我的意思是说字符串
name是一个键,而字符串age是另一个键。 -
@Ravi 听起来您不知道密钥是什么,也不知道它是如何工作的。一个值是键(必须是唯一的,名称和年龄都不是唯一的)另一个是“值”
-
@user39950 即使完全在内存中,编写
Stream代码也比显式循环更容易、更易读。一方面:显式循环可能会做任何事情,这意味着它也可能包含任何类型的错误。Stream操作是众所周知且定义明确的,因此通过查看操作,您已经非常了解正在发生的事情。使用循环,您必须查看整个循环,解码每一行并确保没有任何花哨的事情发生,然后您才能很好地了解它的作用。
标签: java java-8 java-stream