Tag: language lawyer

JDK类除了Javadoc之外还有其他任何规范吗?

JDK类除了Javadoc之外还有其他任何规范吗? 如果是这样,在哪里? 例如,考虑Collections.unmodifiableMap 。 它的Javadoc没有提及线程安全性; 所以,从Javadoc开始,我不能认为将结果映射暴露给其他线程是安全的,而不需要采取我自己的一些特殊步骤来获得线程安全性。 但恕我直言,任何现实的实现都会将内部地图存储在final字段中,因此在Java 5及更高版本中,只要内部地图是(在任何访问之间具有“先发生”关系),结果地图将是线程安全的生成的地图以及之前对内部地图的修改)。 例如,这就是OpenJDK实现的function。 那么,我怎么能弄清楚我是否可以轻易地假设一个给定的行为?

必须partitioningBy生成一个包含true和false条目的地图?

partitioningBy收集器将谓词应用于流中的每个元素,并生成从布尔到满足或不满足谓词的流中元素列表的映射。 例如: Stream.of(1,2,3,4).collect(partitioningBy(x -> x >= 3)) // {false=[1, 2], true=[3, 4]} 正如分区的目的是什么所讨论的 , 观察到的行为是partitioningBy总是返回一个包含true和false条目的映射。 例如: Stream.empty().collect(partitioningBy(x -> false)); // {false=[], true=[]} Stream.of(1,2,3).collect(partitioningBy(x -> false)); // {false=[1, 2, 3], true=[]} Stream.of(1,2,3).collect(partitioningBy(x -> true)); // {false=[], true=[1, 2, 3]} 这种行为实际上是在某处指定的吗? Javadoc只说: 返回一个Collector,它根据Predicate对输入元素进行分区,并将它们组织成Map<Boolean, List> 。 返回的Map的类型,可变性,可序列化或线程安全性无法保证。 符合实现可以返回这些: Stream.empty().collect(partitioningBy(x -> false)); // {}, or {false=[]}, or {true=[]} Stream.of(1,2,3).collect(partitioningBy(x […]

main是一个有效的Java标识符吗?

我的一个孩子正在高中学习Java,并在他的一个测试中得到了这个: 以下哪项是Java中的有效标识符? 一个。 123java 湾 main C。 java1234 d。 {abce 即 )whoot 他回答了b并弄错了。 我查看了这个问题并认为main 是一个有效的标识符,它应该是正确的。 我们看了一下标准的Java 规范 ,并强调了这一点。 我们还编写了一个示例程序,它有一个名为main的变量,以及一个方法。 他创建了一个书面反驳,包括Java文档参考,测试程序和老师忽略它,并说答案仍然是错误的。 main是有效的标识符吗?

lambdas中隐含的匿名类型

在这个问题中 ,用户@Holger提供了一个答案 ,显示了匿名类的不常见用法,我不知道。 该答案使用流,但这个问题不是关于流,因为这个匿名类型构造可以在其他上下文中使用,即: String s = “Digging into Java’s intricacies”; Optional.of(new Object() { String field = s; }) .map(anonymous -> anonymous.field) // anonymous implied type .ifPresent(System.out::println); 令我惊讶的是,这会编译并打印预期的输出。 注意:我很清楚,自古以来,可以构造一个匿名内部类并使用其成员,如下所示: int result = new Object() { int incr(int i) {return i + 1; } }.incr(3); System.out.println(result); // 4 但是,这不是我在这里要求的。 我的情况不同,因为匿名类型是通过Optional方法链传播的。 现在,我可以想象这个function的一个非常有用的用法……很多时候,我需要在Stream管道上发布一些map操作,同时还保留原始元素,即假设我有一个人员列表: public class Person { Long […]

为什么在这种情况下允许抛出检查的exception类型?

我偶然注意到这个throw语句(从一些更复杂的代码中提取)编译: void foo() { try { } catch (Throwable t) { throw t; } } 对于一个短暂但快乐的时刻,我认为已经检查过的exception最终决定已经死了,但它仍然很高兴: void foo() { try { } catch (Throwable t) { Throwable t1 = t; throw t1; } } try块不必为空; 它似乎可以有代码,只要该代码不会抛出一个已检查的exception。 这似乎是合理的,但我的问题是,语言规范中的哪些规则描述了这种行为? 据我所知 , §14.18town语句明确禁止它,因为t表达式的类型是一个经过检查的exception,并且它没有被捕获或声明被抛出。 (?)