2016-06-08 40 views
0

内实例我该怎么办了Java 8个流做Java的8个流

for (List<Category> parentPath : getPathsInternal(parent, controlSet)) { 
    if (!(parentPath instanceof LinkedList)) { 
    parentPath = new LinkedList<Category>(parentPath); 
    } 
    parentPath.add(category); 
    result.add(parentPath); 
} 

内实例,我不知道如何用Java编写8个流等功能。任何方向?

if (!(parentPath instanceof LinkedList)) { 
    parentPath = new LinkedList<Category>(parentPath); 
    } 
+2

你知道lambda可以是多行,对不对?他们可以包括你想要的任何陈述? –

+0

我可以做getPath ... Stream()。forEach(....所有逻辑..)但我想看到更好的方式,这可能是可能的 –

+2

在99%的所有'LinkedList'用法中,它是错误的选择。另外1%无论如何都需要重新设计一个完整的应用程序。那么,为什么你要将非'LinkedList'转换为'LinkedList's,为什么你要做*有条件的*?是否“有时修改源代码”真的是你想实现的目标? – Holger

回答

3
getPathsInternal(parent, controlSet).stream() 
    .map(parentPath -> 
     (parentPath instanceof LinkedList) 
      ? parentPath : new LinkedList<>(parentPath)) 
    .peek(parentPath -> parentPath.add(category)) 
    .collect(toList()); // or whatever result is 
+0

我认为使用'peek()'产生副作用通常是不被接受的。虽然OP的问题比你的回答更具问题。 – shmosel

+1

'peek'的整个_point_是副作用。它从字面上不能用于其他任何事情。 (但是,试图做副作用是有问题的。) –

+0

我的意思是除了用于调试目的。有一个原因被称为“偷看”,而不是“做”或“消耗”。 – shmosel

2

我觉得这个代码是相同的:

getPathsInternal(parent, controlSet).stream() 
    .map(parentPath -> (parentPath instanceof LinkedList) ? parentPath : new LinkedList<>(parentPath)) 
    .peek(parentPath -> parentPath.add(category)) 
    .collect(Collectors.toList()) 
1

还有一堆的方法可以做到这一点,但可能是最可读的是分裂成两个功能成语。

List<Category> result = getPathsInternal(parent, controlSet).stream() 
    .map((parentPath) -> parentPath instanceof LinkedList ? parentPath : new LinkedList<>()) 
    .collect(Collectors.toList()) 
result.stream() 
    .forEach((parentPath) -> parentPath.add(category)); 
+0

如果你不打算在结果中使用流函数,你也可以使用List :: forEach来代替:result.forEach(parentPath - > parentPath.add(category)); – srborlongan

0

添加到约偷看从路易斯的回答发起讨论:

由于

parentPath.add(category) 

是相当的流对象本身的转变,我认为这是一个地图操作,即使你在这种情况下必须使用块语法:

getPathsInternal(parent, controlSet).stream() 
    .map(parentPath -> 
     (parentPath instanceof LinkedList) 
      ? parentPath : new LinkedList<>(parentPath)) 
    .map(parentPath -> { parentPath.add(category); return parentPath; }) 
    .collect(toList());