Tag: java 8

相当于Scala dropWhile

我正在努力寻找一种方法来跳过流的开头的一些元素,具体取决于谓词。 像这样的东西: dropWhile( n -> n < 3, Stream.of( 0, 1, 2, 3, 0, 1, 2, 3, 4 ) ) .forEach( System.out::println ); 3 0 1 2 3 4 这相当于Scala dropWhile 。

在Java 8中,是否有ByteStream类?

Java 8为double , int和long提供了Stream : DoubleStream , IntStream和LongStream 。 但是,我在文档中找不到等效的byte 。 Java 8是否提供ByteStream类?

将列表拆分为多个列表,在java 8中具有固定数量的元素

我想要一些类似于scala分组函数的东西。 基本上,一次挑选2个元素并处理它们。 以下是相同的参考: 将列表拆分为具有固定数量元素的多个列表 Lambdas确实提供了诸如groupingBy和partitioningBy之类的东西,但它们似乎都没有像Scala中的分组函数那样做。 任何指针将不胜感激。

如何在方法引用(toString of Integer)上修复歧义类型?

这样做的时候 Stream.of(1, 32, 12, 15, 23).map(Integer::toString); 我得到一个模糊的类型错误。 可以理解,编译器无法判断我是指来自Integer toString(int)还是toString() 。 当不使用方法引用时,我可能已经通过显式转换或者写出generics的长手来解决这个问题, 但是我怎么能让编译器知道我的意思呢? 我可以使用什么语法(如果有的话)来明确?

在JRE 8中使用JavaFX,“访问限制”错误

当我在新的java 8项目中尝试使用javafx相关类时,我从eclipse中获得了访问限制错误。 到目前为止,我能找到的唯一“解决方案”是告诉eclipse忽略访问限制,但我对此并不满意。 错误的一个例子: Access restriction: The type Pane is not accessible due to restriction on required library C:\Program Files\Java\jre8_0\lib\ext\jfxrt.jar 我正在使用Eclipse Kepler和Java 8的Eclipse JDT补丁。 这似乎是与JavaFX不是JavaSE执行环境的一部分有关的问题。 我现在很困惑,因为根据http://en.wikipedia.org/wiki/JavaFX,javaFX是JavaSE的一部分。 是否有可能Eclipse没有意识到它是javaSE的一部分?

为什么最大递归深度我可以达到非确定性?

我决定尝试一些实验,看看我能发现堆栈帧的大小,以及当前执行代码在堆栈中的距离。 我们可能会在这里调查两个有趣的问题: 当前代码的深度是多少级别? 当前方法遇到StackOverflowError之前可以达到多少级别的递归? 堆栈当前执行代码的深度 这是我能想到的最好的: public static int levelsDeep() { try { throw new SomeKindOfException(); } catch (SomeKindOfException e) { return e.getStackTrace().length; } } 这看起来有点黑客。 它生成并捕获exception,然后查看堆栈跟踪的长度。 不幸的是,它似乎也有一个致命的限制,即返回的堆栈跟踪的最大长度为1024.除此之外的任何内容都被削减,因此此方法可以返回的最大值为1024。 题: 有没有更好的方法做到这一点,不是那么hacky并没有这个限制? 对于它的价值,我的猜测是没有: Throwable.getStackTraceDepth()是一个本机调用,它建议(但不能certificate)它不能用纯Java完成。 确定我们剩下多少递归深度 我们可以达到的等级数量将由(a)堆栈帧的大小和(b)剩余堆栈量确定。 让我们不要担心堆栈帧的大小,只需看看在我们遇到StackOverflowError之前我们可以达到多少级别。 这是我执行此操作的代码: public static int stackLeft() { try { return 1+stackLeft(); } catch (StackOverflowError e) { return 0; } } 它的工作令人钦佩,即使它在堆栈剩余量方面是线性的。 […]

Java的lambda语法有什么细分?

请解释Java 8的lambda方法的语法。 有很多关于lambda函数的解释,但我找不到语法的详尽解释,我发现很难学会正确复制语法,因为我不明白为什么他们’按原样重写。 这是我遇到的常见案例,由NetBeans提供: public static void main(String[] args) { SwingUtilities.invokeLater(() -> { new MainAppJFrame(); }); } 所以,不知何故,以下lambda表达式正在解析为匿名的Runnable对象的run()方法: () -> { // do stuff } ->是lambda语法,对吗? 花括号只是包含匿名方法代码。 括号是否为空参数,因为在这种情况下我们正在创建一个Runnable.run()方法? 这一点对我来说都不太清楚。 我假设编译器知道根据SwingUtilities.invokeLater(Runnable)方法所期望的类型实例化一个匿名的Runnable ? 如果有两个SwingUtilities.invokeLater方法只在参数列表中有所不同,会发生什么? 显然,在这种特定情况下没有,但在其他地方可能: interface ExampleLambdaConsumer { public void doSomething(Runnable r); public void doSomething(java.lang.reflect.Method m); } class C implements ExampleLambdaConsumer { // implementations for doSomething methods […]

Java 8嵌套(多级)组

我有几个类,如下 class Pojo { List items; } class Item { T key1; List subItems; } class SubItem { V key2; Object otherAttribute1; } 我想基于key1聚合项目,对于每个聚合,子项应由key2按以下方式聚合: Map<T, Map<V, List> 如何使用Java 8 Collectors.groupingBy嵌套? 我正在尝试一些东西并且中途停留 pojo.getItems() .stream() .collect( Collectors.groupingBy(Item::getKey1, /* How to group by here SubItem::getKey2*/) ); 注意:这与级联groupingBy ,后者基于此处讨论的同一对象中的字段进行多级聚合

在Java中,如何高效优雅地传输树节点的后代?

假设我们有一组由唯一String标识的对象,以及一个定义它们层次结构的类Tree 。 该类使用从节点(由其ID表示)到其各自子节点ID的Collection的Map来实现。 class Tree { private Map<String, Collection> edges; // … public Stream descendants(String node) { // To be defined. } } 我想启用流式节点的后代。 一个简单的解决方案是: private Stream children(String node) { return edges.getOrDefault(node, Collections.emptyList()).stream(); } public Stream descendants(String node) { return Stream.concat( Stream.of(node), children(node).flatMap(this::descendants) ); } 在继续之前,我想对此解决方案做出以下断言。 (我对这些是正确的吗?) 从descendants返回的Stream消耗资源(时间和内存) – 相对于树的大小 – 与复制的手动编码的复杂程度相同。 特别是,表示迭代状态的中间对象( Stream s, […]