我有一个包含项目列表的大文件.
我想创建一批项目,使用此批处理发出HTTP请求(所有项目都需要作为HTTP请求中的参数).我可以通过for循环很容易地完成它,但作为Java 8的爱好者,我想尝试用Java 8的Stream框架编写它(并获得延迟处理的好处).
例:
List<String> batch = new ArrayList<>(BATCH_SIZE);
for (int i = 0; i < data.size(); i++) {
batch.add(data.get(i));
if (batch.size() == BATCH_SIZE) process(batch);
}
if (batch.size() > 0) process(batch);
Run Code Online (Sandbox Code Playgroud)
我想做一些很长的路要走
lazyFileStream.group(500).map(processBatch).collect(toList())
最好的方法是什么?
使用Java流,很容易找到与给定属性匹配的元素.
如:
String b = Stream.of("a1","b2","c3")
.filter(s -> s.matches("b.*"))
.findFirst().get();
System.out.println("b = " + b);
Run Code Online (Sandbox Code Playgroud)
产生:
b = b2
然而,通常人们在匹配后想要一个或多个值,而不是匹配本身.我只知道如何用旧时尚循环来做到这一点.
String args[] = {"-a","1","-b","2","-c","3"};
String result = "";
for (int i = 0; i < args.length-1; i++) {
String arg = args[i];
if(arg.matches("-b.*")) {
result= args[i+1];
break;
}
}
System.out.println("result = " + result);
Run Code Online (Sandbox Code Playgroud)
哪个会产生:
结果= 2
使用Java 8 Streams有一种干净的方法吗?例如,给定上面的数组和谓词,将结果设置为"2" s -> s.matches("-b.*").
如果你可以获得下一个值,那么也可以获得下一个N值或所有值的列表/数组,直到另一个谓词匹配为止s -> s.matches("-c.*").
我正在尝试将列表拆分为列表,其中每个列表的最大大小为4.
我想知道如何使用lambdas做到这一点.
目前我正在这样做的方式如下:
List<List<Object>> listOfList = new ArrayList<>();
final int MAX_ROW_LENGTH = 4;
int startIndex =0;
while(startIndex <= listToSplit.size() )
{
int endIndex = ( ( startIndex+MAX_ROW_LENGTH ) < listToSplit.size() ) ? startIndex+MAX_ROW_LENGTH : listToSplit.size();
listOfList.add(new ArrayList<>(listToSplit.subList(startIndex, endIndex)));
startIndex = startIndex+MAX_ROW_LENGTH;
}
Run Code Online (Sandbox Code Playgroud)
UPDATE
似乎没有一种简单的方法可以使用lambdas来拆分列表.虽然所有的答案都非常受欢迎,但它们也是lambdas不简化事物的一个很好的例子.