Tag: java 8

如果密钥以与equals不一致的方式实现Comparable,那么Java 8的HashMap是否会出错?这是一个错误吗?

我知道,从Java 8开始,如果HashMap有足够的哈希冲突,并且密钥实现了Comparable ,它将使用平衡树而不是bin的链表 。 但是从我所看到的, Comparable接口并不要求 compareTo() “与equals()一致”(尽管强烈建议)。 我错过了什么? 似乎新的实现允许HashMap违反Map接口的要求,如果密钥恰好具有兼容但非推荐的Comparable实现。 以下JUnit测试在OpenJDK 8u72上公开此行为: import static org.junit.Assert.*; import java.util.HashSet; import java.util.Set; import org.junit.Test; class Foo implements Comparable // Comment this out to fix the test case { private final int bar; private final int baz; Foo(int bar, int baz) { this.bar = bar; this.baz = baz; } […]

Avatar.js和Project Avatar

在Java 8和Nashorn的上下文中,我看到有两个项目经常被提及。 Avatar.js和Project Avatar 这些项目的关系是什么? Avatar.js的文档很少。 据我所知,它提供了在JVM上执行节点应用程序的可能性。 项目头像似乎建立在Avatar.js上。 但是,范围似乎是为Java EE 7提供替代Web框架。是否也可以使用Project Avatar执行节点程序(例如grunt)?

流filter的时间复杂度

我有这样的代码: List Listings = new ArrayList(); Listings.add(listing1); Listings.add(listing2); … … … Listing listing= listings.stream() .filter(l -> l.getVin() == 456) .findFirst(); 我的问题是过滤过程的时间复杂度是多少? 如果它是O(n),我的直觉是将它转换为HashSet,就像数据结构一样,这样时间复杂度可能变成O(1),是否有一种优雅的方式来实现流 ?

遇到订单友好/不友好的终端操作与并行/顺序与有序/无序流

受这个问题的启发,我开始玩有序与无序流,并行与顺序流和终端操作,这些操作遵循不受其尊重的遭遇顺序与终端操作。 在对链接问题的一个答案中,显示了与此类似的代码: List ordered = Arrays.asList( 1, 2, 3, 4, 4, 3, 2, 1, 1, 2, 3, 4, 4, 3, 2, 1, 1, 2, 3, 4); List result = new CopyOnWriteArrayList(); ordered.parallelStream().forEach(result::add); System.out.println(ordered); System.out.println(result); 这些名单确实不同。 unordered列表甚至从一次运行变为另一次运行,表明结果实际上是非确定性的。 所以我创建了另一个例子: CopyOnWriteArrayList result2 = ordered.parallelStream() .unordered() .collect(Collectors.toCollection(CopyOnWriteArrayList::new)); System.out.println(ordered); System.out.println(result2); 我希望看到类似的结果,因为流是并行和无序的(可能是unordered()是多余的,因为它已经是并行的)。 但是,生成的列表是有序的,即它等于源列表。 所以我的问题是为什么收集的清单是有序的? collect总是尊重遭遇顺序,即使对于平行,无序的流? 它是特定的Collectors.toCollection(…)收集器强制遭遇订单吗?

其他流的笛卡尔积的流,每个元素作为List?

如何使用Java 8实现一个函数来获取一些流,并生成一个流,其中每个元素都是一个由流的笛卡尔积的一个成员组成的列表? 我看过这个问题 – 这个问题使用了一个BinaryOperator的聚合BinaryOperator (取两个类似的类型并生成相同类型的项目)。 我希望最终结果中的项目是List而不是输入流中元素的类型。 具体而言,假设我所需的function称为product ,如下: Stream<List> result = product( Stream.of(“A”, “B”, “C”, “D”), Stream.of(“I”, “J”, “K), Stream.of(“Y”, “Z”) ); result.forEach(System.out::println); 应该打印: [A, I, Y] [A, I, Z] [A, J, Y] [A, J, Z] [A, K, Y] [A, K, Z] [B, I, Y] … [D, K, Y] [D, K, Z] 理想情况下,我希望这个操作尽可能地懒惰。 例如,如果输入流是由Stream.generate() […]

如何找到Java8方法引用的目标?

我想捕获对模拟对象的调用 public interface Service { public String stringify(Object o); } service = mockery.mock(Service.class); mockery.allowing(service::stringify).with(42).will(() -> “42”); 所以内部allowing我有一个Function 是否有任何reflecto-magic可以让我从方法参考创建的函数中找到服务? public WithClause allowing(Function f) { Object myServiceBackAgain = findTargetOf(function); …. } 我知道函数将始终来自这些方法引用,所以我很乐意尽可能地向下转换。 这与相关的问题不同是否可以将方法引用转换为MethodHandle? 因为,一开始它不是同一个问题,只是在相关领域。 即使我可以获得MethodHandle,我也无法从中获取目标。

递归取消allOff CompletableFuture

如果我有 CompletableFuture future1 = service.request(param1); CompletableFuture future2 = service.request(param2); CompletableFuture many = CompletableFuture.allOf(future1, future2); 当我做many.cancel()时会发生什么? future1和future2被取消吗? 如果没有,那么实现这一目标的最简洁方法是什么? 我不愿意坚持future1和future2 ,只是为了能够在取消many时取消它们。 关于为什么我想要这个的一些背景:当接收一条数据时,我需要请求匹配的,可能未来的数据来执行计算。 如果有更新的数据到达,我想取消先前计算的完成,因为结果将立即被新计算取代。

Java 8中静态方法引用的限制

我正在尝试使用方法引用来捕获方法调用,并且遇到了一些限制。 这很好用: void capture(Function in) { } private interface Foo { String getBar(); } capture(Foo::getBar); 但是,如果我将Foo.setBar的签名更改为以下内容: private interface Foo { void setBar(String bar); } capture(Foo::setBar); 我收到一个错误: Cannot make a static reference to the non-static method setBar(String) from the type MyTest.Foo 我不清楚限制是什么。 理想情况下,我想使用方法引用来捕获标准setter上的调用。 有没有办法做到这一点?

自JDK 7以来,Java JDK 8 IndexedPropertyDescriptor已使用List对象进行了更改

我有一个简单的问题。 我有一个在Java JDK7中工作的程序,但由于一些内省的更改,它在JDK8中不起作用。 这是一个重现问题的测试程序: import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) throws IntrospectionException { BeanInfo info = Introspector.getBeanInfo(MyListClass.class); PropertyDescriptor[] descriptors = info.getPropertyDescriptors(); for (int i = 0; i < descriptors.length; i++) { System.out.println(descriptors[i].getClass().getName() + ":" + descriptors[i].getName()); } System.out.println("\n"); BeanInfo info2 […]

Lambda Metafactory变量捕获

使用MethodHandles.Lookup , MethodHandle , MethodType等手动创建lambda时,如何实现变量捕获? 例如,没有捕获: public IntSupplier foo() { return this::fortyTwo; } /** * Would not normally be virtual, but oh well. */ public int fortyTwo() { return 42; } 和它的笨重forms,使用java.lang.invoke东西: public IntSupplier foo() { MethodHandles.Lookup lookup = MethodHandles.lookup(); MethodType methodType = MethodType.methodType(int.class), lambdaType = MethodType.methodType(IntSupplier.class); MethodHandle methodHandle = lookup.findVirtual(getClass(), “fortyTwo”, methodType); CallSite callSite […]