Tag: java 8

使用方法引用而不是多参数lambda

我对“引用特定类型的任意对象的实例方法”背后的概念感到困惑。 Oracle 文档有一个关于此的示例: String[] stringArray = { “Barbara”, “James”, “Mary”, “John”, “Patricia”, “Robert”, “Michael”, “Linda” }; Arrays.sort(stringArray, String::compareToIgnoreCase); 我在这种方法参考中看到的大多数例子都是这样的:如果lambda类似于: x -> x.func()那么你可以像ClassOfX::func一样编写它。 文档中的示例说: 方法引用String :: compareToIgnoreCase的等效lambda表达式将具有forms参数列表(String a,String b),其中a和b是用于更好地描述此示例的任意名称。 方法引用将调用方法a.compareToIgnoreCase(b)。 问题是:对于任何两个参数lambda,如(a, b) -> a.func(b) , func方法必须是第一个参数的实例方法,lambda的第二个参数将作为参数传递给该方法吗? 如果我们有多个参数lambda,那么func方法必须是lambda的第一个参数的实例方法,而lambda的其他参数将按照lambda中出现的顺序传递给func ? 我的意思是代替(a, b, c) -> a.func(b, c)我们可以编写ClassOfA::func 对不起我的英语。 我希望我能清楚地解决这个问题。

Java Streams:如何做一个有效的“独特和排序”?

让我们假设我有一个Stream并希望只获得不同的元素并进行排序。 天真的做法是做到以下几点: Stream.of(…) .sorted() .distinct() 或者,也许相反: Stream.of(…) .distinct() .sorted() 由于JDK的源代码无法实现这两者的实现,我只是想知道可能的内存消耗和性能影响。 或者,如下所示编写我自己的filter会更高效吗? Stream.of(…) .sorted() .filter(noAdjacentDuplicatesFilter()) public static Predicate noAdjacentDuplicatesFilter() { final Object[] previousValue = {new Object()}; return value -> { final boolean takeValue = !Objects.equals(previousValue[0], value); previousValue[0] = value; return takeValue; }; }

如何在Java 8中比较两个Streams

比较Java 8中的两个Stream实例并找出它们是否具有相同的元素,特别是用于unit testing的目的是什么? 我现在得到的是: @Test void testSomething() { Stream expected; Stream thingUnderTest; // (…) Assert.assertArrayEquals(expected.toArray(), thingUnderTest.toArray()); } 或者: Assert.assertEquals( expected.collect(Collectors.toList()), thingUnderTest.collect(Collectors.toList())); 但这意味着我正在构建两个集合并丢弃它们。 考虑到测试流的大小,这不是性能问题,但我想知道是否有一种规范的方法来比较两个流。

当许多密钥具有相同的哈希码时,Java 8的HashMap如何退化为平衡树?

当许多密钥具有相同的哈希码时,Java 8的HashMap如何退化为平衡树? 我读到键应该实现Comparable来定义一个排序。 HashMap如何结合散列和自然排序来实现树? 那些没有实现Comparable ,或者多个不可互相比较的Comparable实现是同一个映射中的键呢?

变量已经在方法lambda中定义

考虑以下几乎可编译的Java 8代码: public static void main(String[] args) { LinkedList users = null; users.add(new User(1, “User1”)); users.add(new User(2, “User2”)); users.add(new User(3, “User3”)); User user = users.stream().filter((user) -> user.getId() == 1).findAny().get(); } static class User { int id; String username; public User() { } public User(int id, String username) { this.id = id; this.username = username; } […]

为什么我不能在Java 8 lambda表达式中抛出exception?

我升级到Java 8并试图用一个新的lamdba表达式替换一个简单的迭代迭代。 循环搜索空值并在找到exception时抛出exception。 旧的Java 7代码如下所示: for (Map.Entry entry : myMap.entrySet()) { if(entry.getValue() == null) { throw new MyException(“Key ‘” + entry.getKey() + “‘ not found!”); } } 我将其转换为Java 8的尝试如下所示: myMap.forEach((k,v) -> { if(v == null) { // OK System.out.println(“Key ‘” + k+ “‘ not found!”); // NOK! Unhandled exception type! throw new MyException(“Key ‘” + […]

如何实现Java流?

我想实现Stream 。 我不想只使用implements Stream ,因为我必须实现大量的方法。 这可以避免吗? 更具体一点,我如何流t1 , t2和t3 ,例如: class Foo { T t1, t2, t3; Foo(T t1, T t2, T t3) { this.t1 = t1; this.t2 = t2; this.t3 = t3; } }

如何在Java 8中对对象列表进行分页?

给定一个包含n元素和所需页面大小为m的java.util.List ,我想将其转换为包含n/m+n%m元素的映射。 每个地图元素应包含m元素。 这是一个整数的例子: List list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); // What is the equivalent Java 8 code to create the map below from my list? Map<Integer, List> map = new HashMap(); map.put(0, Arrays.asList(1,2,3)); map.put(1, Arrays.asList(4,5,6)); map.put(2, Arrays.asList(7,8,9)); map.put(3, Arrays.asList(10)); 这是可能的,使用Java 8?

在管道中间关闭流

当我执行此代码时,它会在流管道中打开大量文件: public static void main(String[] args) throws IOException { Files.find(Paths.get(“JAVA_DOCS_DIR/docs/api/”), 100, (path, attr) -> path.toString().endsWith(“.html”)) .map(file -> runtimizeException(() -> Files.lines(file, StandardCharsets.ISO_8859_1))) .map(Stream::count) .forEachOrdered(System.out::println); } 我得到一个例外: java.nio.file.FileSystemException: /long/file/name: Too many open files 问题是当Stream.count完成后, Stream.count不会关闭流。 但我不明白为什么它不应该,因为它是一个终端操作。 对于其他终端操作(例如reduce和forEach 。 另一方面, flatMap关闭它所包含的流。 该文档告诉我使用try-with-resouces语句在必要时关闭流。 在我的情况下,我可以用这样的东西替换count行: .map(s -> { long c = s.count(); s.close(); return c; } ) 但这是嘈杂和丑陋的,在某些情况下可能会给大型复杂的管道带来真正的不便。 所以我的问题如下: 为什么流设计不是为了让终端操作关闭他们正在处理的流? […]

为什么我们可以使用’this’作为实例方法参数?

什么是Java中的receiver参数? Java 8语言规范谈到了this 。