我想从并行流中将列表结果收集到一个列表中.让我们看看这段代码来更好地解释我的问题.这就是我得到的:
List<Object> a = new ArrayList<>();
List<List<Object>> result a.parallelStream() // I get a List of List
.map(a -> { return new ArrayList(); })
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
但我真正想拥有的更像是这样的:
List<Object> a = new ArrayList<>();
List<Object> result a.parallelStream() // I want to add all list elements into one List of objects
.map(a -> { return new ArrayList(); })
.collect(Collectors.???);
Run Code Online (Sandbox Code Playgroud) 当我最初问这个问题,2015年2月,在报道的行为所链接的问题是反直觉的,但那种规范允许(尽管在文档一些小的矛盾).
然而,Tagir Valeev在2015年6月问了一个新问题,我认为他清楚地证明了这个问题中报告的行为实际上是一个错误.Brain Goetz回答了他的问题,并承认,当一个终端操作触发时,不会阻止on 的特性的反向传播是一个错误,这个终端操作不会被迫尊重元素的遭遇顺序(例如) .此外,在他自己的回答的评论中,他分享了JDK的错误跟踪系统中发布的问题的链接.UNORDEREDStreamskip()forEach()
该问题的状态现已解决,其修复版本为9,这意味着该修复程序将在JDK9中可用.但是,它也被反向移植到JDK8 update 60,build 22.
所以从JDK8u60-b22开始,这个问题再也没有意义了,因为现在skip()表现得像直觉一样,甚至在并行流上也是如此.
我原来的问题是......
最近我和一些同事讨论了这件事.我说skip()在并行流上使用它是没用的,因为它似乎没有一个很好的用例.他们告诉我有关性能提升,FJ池处理,jvm可用的核心数量等等,但他们无法给我任何实际的使用示例.
skip()并行流是否存在良好的用例?
我有一些遗留代码(使用JDK 7u55成功编译并运行),类似于以下内容:
private static class MyHashMap extends HashMap {
static Method getEntryMethod;
static {
try {
getEntryMethod = HashMap.class.getDeclaredMethod("getEntry", Object.class);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
MyHashMap myHashMap = new MyHashMap();
}
Run Code Online (Sandbox Code Playgroud)
尝试切换到JDK 8u31后,它失败了:
java.lang.NoSuchMethodException: java.util.HashMap.getEntry(java.lang.Object)
Run Code Online (Sandbox Code Playgroud) Java 8允许您在不同的上下文中使用相同的lambda表达式。考虑下面的代码来演示这一点:
public class LambdasTypeCheck {
public static void main(String []args) {
//Same lambda expression can be used in different contexts.
Predicate<List<String>> predicate = (l) -> l.add("1");
Consumer<List<String>> consumer = (l) -> l.add("1");
}
}
Run Code Online (Sandbox Code Playgroud)
lambda表达式(l) -> l.add("1");在两个地方重复。如何避免这种重复?我可以重用此lambda表达式的一种方法是,是否有一些接口/类是所有lambda表达式的父级,这样我就可以将任何lambda表达式分配给此类接口/类的引用。
任何人都可以向我解释为什么这个测试通过:
import org.junit.Assert;
import org.junit.Test;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import static org.hamcrest.core.Is.is;
public class BasicTest extends Assert{
@Test
public void testLocalTimeWithPredefinedPattern() throws Exception {
DateTimeFormatter dtf = DateTimeFormatter.ISO_TIME;
LocalTime time = LocalTime.parse("10:11:12", dtf);
assertThat(time.toString(), is("10:11:12"));
}
/**
* It's a kind of bug from my side of view
*/
@Test(expected = DateTimeParseException.class)
public void testLocalTimeWithCustomPattern() throws Exception {
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("hh:mm:ss");
LocalTime time = LocalTime.parse("10:11:12", dtf);
}
}
Run Code Online (Sandbox Code Playgroud)
第二次测试捕获的异常如下所示:
java.time.format.DateTimeParseException: Text '10:11:12' could not be parsed: Unable …Run Code Online (Sandbox Code Playgroud) 添加到Java 8中HashMap中包含的BigDecimal的最简单方法是什么?
以下Interface允许我这样做displayReuestResponse<String>:
public interface RequestResponse<T>
{
void displayRequestResponse(T output);
}
Run Code Online (Sandbox Code Playgroud)
另一方面,以下Interface允许我通过LinkedHashSet或者ArrayList:
public interface RequestResponse<T>
{
void displayRequestResponse(Collection<T> output);
}
Run Code Online (Sandbox Code Playgroud)
我只是好奇,我们是否可以通过(调整)Interface可以接受这两种类型的方式使其更通用?或者这不可能吗?
我有一个带有lambda表达式的检票口项目。在用户单击后退按钮的一页上,我的应用程序崩溃:
java.lang.IllegalArgumentException: Invalid lambda deserialization
at x.y.z.MyPage$3.$deserializeLambda$(MyPage.java:1)
Run Code Online (Sandbox Code Playgroud)
在页面类(我返回的地方)中,我使用lambda表达式实现此接口:
public interface Localizator extends Serializable {
String getLocalizedString(String key);
}
Run Code Online (Sandbox Code Playgroud)
和lambda:
protected void someMethod() {
localize((String key) -> getString(key));
}
Run Code Online (Sandbox Code Playgroud)
当我将lambda更改为匿名类时,一切正常。在这种情况下应如何使用lambda?
信封:Java 1.8.0_25,Netbeans 8.0.2,Wicket 6.17.0。
编辑:这是带有lambda的真实(但简化)方法:
@Override
protected DataLoader createDataLoader() {
return new DataLoader(){
@Override
public List loadData() {
...
}
@Override
public List convertToTableRows(List data) {
return Converter.asRowList(
data,
(Record record) -> {...}, // this lambda is OK
(String key) -> getString(key)); // this lambda is crashing
}
@Override
public List …Run Code Online (Sandbox Code Playgroud) 我有这个代码,我想在Java 8风格中看到它:
List<Double> outcome = ....
int step = data.size / 20;
for (int i = 0; i < 20; i++) {
Instance inst = data.get(i * step).getInstance();
if (inst.isPresent())
outcome.add(100);
else
outcome.add(0.0);
Run Code Online (Sandbox Code Playgroud)
对我来说,很容易将代码转换为Java 8流,但我不知道如何实现该data.get(i * step)部分.
我想用一些包含数量的对象来迭代一个数组并获得totalQuantity,但是使用Java 8的新API代替每个循环的tipical.
这是我到目前为止的方式:
int totalQuantityOrdered=0;
totalQuantityOrdered=CollectionUtils.isNotEmpty(details)?details.stream().forEach(detail->totalQuantityOrdered+=detail.getOrderHeader().getQuantity()):totalQuantityOrdered;
Run Code Online (Sandbox Code Playgroud)
但是我收到一个编译错误,告诉我为了使用lambda表达式,变量totalQuantityOrdered必须是final.然后我认为当变量是final时意味着它的值不能被修改,所以在这种情况下我如何实现我想要做的事情?
提前告诉你你的时间.
java-8 ×10
java ×7
lambda ×4
bigdecimal ×1
collections ×1
generics ×1
java-stream ×1
java-time ×1
reflection ×1
reusability ×1
theory ×1
wicket ×1