我着手进行Java 8学习。
我发现了一个有趣的行为:
让我们看一下代码示例:
// identity value and accumulator and combiner
Integer summaryAge = Person.getPersons().stream()
//.parallel() //will return surprising result
.reduce(1,
(intermediateResult, p) -> intermediateResult + p.age,
(ir1, ir2) -> ir1 + ir2);
System.out.println(summaryAge);
和模型类:
public class Person {
String name;
Integer age;
///...
public static Collection<Person> getPersons() {
List<Person> persons = new ArrayList<>();
persons.add(new Person("Vasya", 12));
persons.add(new Person("Petya", 32));
persons.add(new Person("Serj", 10));
persons.add(new Person("Onotole", 18));
return persons;
}
}
12+32+10+18 = 72
。对于顺序流,这个代码总是返回73
其是72 + 1
但对于平行,它总是返回76
其为72 + 4*1
(4等于流元素计数)。
当我看到此结果时,我以为并行流和顺序流返回不同的结果很奇怪。
我在某处违约了吗?
对我来说,73是预期结果,但76不是。
标识值是这样的值x op identity = x
。这是Java所独有的概念,Stream
例如,参见Wikipedia。
它列出了身份元素的一些示例,其中一些可以直接用Java代码表示,例如
reduce("", String::concat)
reduce(true, (a,b) -> a&&b)
reduce(false, (a,b) -> a||b)
reduce(Collections.emptySet(), (a,b)->{ Set<X> s=new HashSet<>(a); s.addAll(b); return s; })
reduce(Double.POSITIVE_INFINITY, Math::min)
reduce(Double.NEGATIVE_INFINITY, Math::max)
应当清楚的是,仅当满足时,才能满足x + y == x
任意表达式,因此是加法的标识元素。同样,是用于乘法的标识元素。x``y==0``0``1
更复杂的例子是
减少谓词流
reduce(x->true, Predicate::and)
reduce(x->false, Predicate::or)
减少功能流
reduce(Function.identity(), Function::andThen)
问题内容: 我们都知道,为了调用,必须将此调用放置在同步块中,否则将引发。但是,进行此限制的原因是什么?我知道这释放了监视器,但是为什么我们需要通过使特定的块同步来显式获取监视器,然后通过调用来释放监视器? 如果可以在同步块之外调用并保留其语义-挂起调用者线程,可能造成什么损害? 问题答案: 只有在还存在时,才有意义,因此它始终与线程之间的通信有关,并且需要同步才能正常工作。有人可能会争辩说这应该
我有一个编辑文本。我希望这个编辑文本始终保持焦点和可写性。我怎么能每次都不碰它呢?因为条形码扫描器机器将数据连续发送到此应用程序。 我尝试了很多方法。但它们都不起作用。我可以设置键盘是可见的,但光标不在编辑文本上。
下面是片段。请注意,我已经恢复到以前的提交,因此丢失了最近的修改,但请查看我编写的代码,然后才注意到始终等于0() 以下是当检测到活动后按: 以下是NoteActivity接收结果调用的方式。 null 我在我的项目上浪费了很多重要的时间,只是想知道是什么使resultCode和requestCode的值丢失了我发送的值。 任何帮助和指导都将不胜感激。非常感谢!
问题内容: 为什么必须始终在Java中初始化局部变量(包括基元)?为什么相同的实例变量不适用? 问题答案: 基本上,要求在读取变量之前为其分配值是一件好事。这意味着您不会意外阅读您不想要的内容。是的,变量可以具有默认值-但如果编译器可以证明您正在尝试读取尚未分配的内容,那么编译器是否可以捕获错误不是更好吗?如果要为局部变量提供默认值,则始终可以显式分配。 现在,对于局部变量来说,这很好-但是对于实
问题内容: 我在服务器端有PHP,在客户端有HTML和javascript。 我正在制作一个应用程序,其中利益相关者键入一条消息,该消息实时广播到一个组的多个接收者。 我在Google上做了一些研究,我了解我需要使用WebSockets或Comet进行实时推送通知。WebSocket或Comet是向用户发送大量通知的必需项吗? 我的理解正确吗?有什么参考开始吗? 问题答案: 如果客户端是浏览器,则
问题内容: 我不知道我的代码正在发生什么。我没有错误,也没有回应。我正在将数据写入串行端口,并通过激活等待响应, 但未触发此事件,inputstream.available()始终返回0。可能是什么问题?我在Linux中使用RXTX。 编辑 我在主要方法上打开端口,并在应用程序内的按钮单击事件上发送消息。 问题答案: 不能用于进程间通信(包括串行),因为它仅检查当前进程中(输入缓冲区中)是否有可用