我写了一个小例子来说明我的问题:
import java.util.Arrays;
import java.util.List;
public class Example {
public static void main( String[] args ) {
String [] array = {"1 0101 5","1 0101 5"};
Arrays.stream(array)
.map(str->str.split(" "))//every String is mapped to an array of String
.map(arr-> returnAListOf5Element( Integer.parseInt(arr[0]),arr[1],Integer.parseInt(arr[2])))
.forEach(list-> tesMyList(list));//i want to send the Integer.parseInt(arr[2]) as a second argument
}
/**
*
* test if the list has size of 5
*/
private static void testMyList(List<Integer> myList) {
if (myList.size()==5)
System.out.println("Ok");
}
/**
*
* return a list of 5 element
* @return
*/
private static List<Integer> returnAListOf5Element( int i, String s, int i1 ) {
List list = Arrays.asList(1,2,3,4,5);
return list;
}
}
所以我有一些字符串,例如“ 1 0101 5”,“ 1 0101 5” .....,我使用流操作进行计算。
问题是我想将map方法中找到的参数arr [2]添加到foreach方法中找到的 testMyList 方法中。
testMyList 方法应类似于:
private static void testMyList(List<Integer> myList, int size) {
if (myList.size()==size)
System.out.println("Ok");
}
答案 0 :(得分:4)
我可以看到三种可能的解决方案:
returnAListOf5Element
返回列表中的arr[2]
。 (也就是说,通过联系,它是返回列表中的最后一个元素。)这是一种肮脏的方法。
map
返回一个Map.Entry<List<Integer>, Integer>
,它由returnAListOf5Element(...)
调用和arr[2]
的结果组成。 这是一种更合理的方法。
这两个想法基于上一个操作的缓存状态,因此您可以在下一个操作中使用它。这是获得之前链中计算出的结果的唯一方法。
我发现最后一种方法最简单且性能最佳。看来您不会从这里的流中获得任何好处。我会坚持下去。
答案 1 :(得分:1)
创建自己的类来维护数据,而不要使用诸如List
之类的通用类。
class MyObject {
public final int i;
public final String string;
public final int i1;
public MyObject(int i, String string, int i1){
this.i = i;
this.string = string;
this.i1 = i1;
}
public static MyObject parse(String line) {
String[] split = line.split(" ");
return new MyObject(Integer.parseInt(split[0], split[1], Integer.parseInt(split[2]);
}
}
那你就可以做
Files.lines(filename)
.map(MyObject::parse) // now you have a Stream of MyObjects
.forEach(o -> verify(o));
例如
void verify(MyObject object) {
if (object.i1 < 5) {
System.out.println("invalid");
}
}