Java 避免Lambda中的冗余函数调用

Java 避免Lambda中的冗余函数调用,java,lambda,Java,Lambda,我试图将HTMLstyle属性的内容解析为Map。这是到目前为止我的代码。困扰我的是String::split方法的冗余调用。如何对其进行优化 final String style = "padding-left: 6px; font-weight: bold"; final Map<String, String> result = Arrays.stream(style.split(";")) // .map(String::trim) //

我试图将
HTML
style属性的内容解析为
Map
。这是到目前为止我的代码。困扰我的是
String::split
方法的冗余调用。如何对其进行优化

final String style = "padding-left: 6px; font-weight: bold";
final Map<String, String> result = Arrays.stream(style.split(";")) //
              .map(String::trim) //
              .filter(s -> s.split(":").length <= 2) // invalid
              .collect(Collectors.toMap(s -> s.split(":")[0].trim(),
                  s -> s.split(":").length > 1 ? s.split(":")[1].trim() : ""));
final String style=“左侧填充:6px;字体重量:粗体”;
最终映射结果=Arrays.stream(style.split(“;”))//
.map(字符串::trim)//
.filter(s->s.split(“:”).length s.split(“:”)[0]。trim(),
s->s.split(“:”)。长度>1?s.split(“:”[1]。修剪():”);

您可以通过调用
split
一次,将
字符串映射到数组,然后继续处理该数组:

final Map<String, String> result = Arrays.stream(style.split(";"))
          .map(String::trim)
          .map(s -> s.split(":"))
          .filter(a -> a.length == 2)
          .collect(Collectors.toMap(a -> a[0].trim(), a -> a[1].trim()));
final Map result=Arrays.stream(style.split(“;”))
.map(字符串::trim)
.map(s->s.split(“:”)
.filter(a->a.length==2)
.collect(Collectors.toMap(a->a[0].trim(),a->a[1].trim());
我删除了冗余的
s->s.split(“:”).length>1
检查,因为过滤器已经消除了没有足够元素的数组


我还假设过滤器应该要求数组正好有2个元素。

要将我的注释放入答案,而不是不断调用
s.split(“:”)
,只需将其作为管道的一部分,如下所示:

 final Map<String, String> result = Arrays.stream(style.split(";")) //
          .map(String::trim)
          .map(s->s.split(":")) //
          .filter(s -> s.length <= 2) //
          .collect(Collectors.toMap(s -> s[0].trim(),
              s -> s.length > 1 ? s[1] : ""));
final Map result=Arrays.stream(style.split(“;”))//
.map(字符串::trim)
.map(s->s.split(“:”)//
.filter(s->s.length s[0]。修剪(),
s->s.length>1?s[1]:“”);

如果这正是您所担心的,只需在流中添加另一个
.map(s->s.split(“:”)
。然后在流的其余部分观察到的对象将是
s.split(“:”
的值,而不是
s
我真是个笨蛋。它应该是“s.length<2”。Thanks@user871611如果s.length<2,则s[1]将无效。也许你的意思是s.length==2
@Eran:你说得对。我更新了我的问题。将其更改为
.filter(s->s.split(“:”)。长度您假设的方向正确。我问题中的过滤器应该是
”。filter(s->s.split(“:”).length<2)
@user871611实际上它应该是
长度==2
,否则
收集(Collectors.toMap())
step将始终生成一个
null
值,因为
s.split(“:”).length>1
永远不会为真。你是对的。我更新了我的问题。将其更改为
.filter(s->s.split(:”).length