Tag: java 8

在Stream中过滤Null项

使用Java Stream时,映射后有时会出现空值。 目前,当需要省略这些值时,我使用: .stream() . .filter(element -> element != null) . 对于更具function性的风格,可以快速编写一个小辅助方法: public static boolean nonNull(T entity) { return entity != null; } 这样您就可以使用方法引用: .stream() . .filter(Elements::nonNull) . 我找不到这样的jdk方法,即使我怀疑他们已经包含了一个。 这里有不同的方法吗? 或者他们是否因为某种原因而省略了这个?

如何使用Java 8流将列表的元素映射到它们的索引?

有了一个字符串列表,我需要构建一个有效对(string, its position in the list) 。 目前我有使用google集合的代码: public Robots(List names) { ImmutableList.Builder builder = ImmutableList.builder(); for (int i = 0; i < names.size(); i++) { builder.add(new Robot(i, names.get(i))); } this.list = builder.build(); } 我想用Java 8流做到这一点。 如果没有索引,我可以这样做: public Robots(List names) { this.list = names.stream() .map(Robot::new) // no index here .collect(collectingAndThen( Collectors.toList(), Collections::unmodifiableList )); } 要获得索引,我必须做这样的事情: […]

流和独特的操作

我有以下代码: class C { String n; C(String n) { this.n = n; } public String getN() { return n; } @Override public boolean equals(Object obj) { return this.getN().equals(((C)obj).getN()); } } List cc = Arrays.asList(new C(“ONE”), new C(“TWO”), new C(“ONE”)); System.out.println(cc.parallelStream().distinct().count()); 但我不明白为什么distinct回报3而不是2。

Java 8中使用非静态方法的lambda

我试图在新的Java 8中学习lambdas。有一件有趣的事情。 如果method与function接口具有相同的签名,则可以使用lambdas API将其分配给它。 例如。 Comparator myComp = Integer::compare; 这个方法(Integer.compare)是静态的,取两个值,一切都很完美。 签名与接口方法中的签名相同。 但是,例如,这可以用非静态方法来实现 Comparator myComp = Integer::compareTo. 此方法是非静态的(实例级别),此外,它只需要一个值。 据我所知,Java中没有非静态方法,每个方法都是静态的,但如果它没有标记为静态,则将其作为第一个参数。 如下 compareTo(this,Integer value). 假设由于比较对象和整数而导致结果未定义是合理的。 但是这个工作。 Comparator comparator = Integer::compareTo; Comparator comparator2 = Integer::compare; System.out.println(comparator.compare(1,2)); System.out.println(comparator2.compare(1,2)); 这同样有效。 我调试了调用方法堆栈。 在没有创建实例的情况下调用比较器对象的方法比较时, 值已经由第一个参数初始化,当然这是对象的有效引用。 问题是这是如何工作的? 在调用方法编译器检查时,如果类只有一个字段与方法中的第一个param具有相同的类型,如果类有编译器隐含地创建具有初始化字段的类的新实例或者它是如何工作的?

任何类似filter的lambda操作都不会丢弃?

我基本上想做的事情如下: assertEquals(Arrays.asList(1,2,3).stream() .noDiscardingFilter(x -> x!=1) .map(x -> x*10) .collect(Collectors.toList()), Arrays.asList(1,20,30) ) 这是一个例子,我不需要得到如何解决这个特定问题的答案,这只是一个例子来展示我正在追求的奇特东西。

在Java 8中,“特定类型的任意对象”是什么意思?

在Java 8中,有“方法参考”function。 其中一种是“引用特定类型的任意对象的实例方法” http://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html#type 有人可以解释“特定类型的任意对象”在该背景下的含义吗?

Java 8中的reduce累加器是否允许修改其参数?

在Java 8中,Stream有一个方法减少: T reduce(T identity, BinaryOperator accumulator); 累加器运算符是否允许修改其任一参数? 我认为不是因为JavaDoc说累加器应该是NonInterfering,尽管所有的例子都谈到修改集合,而不是修改集合的元素。 所以,举一个具体的例子,如果有的话 integers.reduce(0, Integer::sum); 并假设Integer是可变的,并允许sum通过向其添加(就地)第二个参数的值来修改其第一个参数? 我认为不是,但我也想要一个这个干扰导致问题的例子。

Java 8和广义目标类型推断

我安装了最后一个JDK 8 ea b114来测试新的语言function。 然而,链式调用中的推断似乎还不起作用。 如果我写: Iterator it = new ArrayList().iterator(); 编译器给我一个错误。 然而,论证位置的推断效果很好。 也许不会插入链式调用中的推断?

如何计算一段时间内的天数?

对于以下Period计算: Period.between(LocalDate.of(2015, 8, 1), LocalDate.of(2015, 9, 2)) 结果是: P1M1D 这相当于31天+ 1天= 32天。 本Period : Period.between(LocalDate.of(2015, 8, 1), LocalDate.of(2015, 10, 2)) 结果是: P2M1D 这相当于:31天(8月)+ 30天(9月)+ 1(10月)= 62天 java.time包中是否有一个方法可以给出一个Period的天数? 我找不到一个。 不确定我是否忽略了任何东西,或者它是否只是在那里。

Lambda表达式如何在Java字节代码中进行翻译

我试图在java中使用lambda表达式创建一个示例,我正在使用官方JDK8。 我的例子运行成功。 但是当我试图检查编译器如何将lambda表达式转换为字节代码时,这让我有些困惑。以下是我的例子的代码: – public class LambdaTest { public Integer lambdaBinaryOpertor(BinaryOperator binaryOperator) { return binaryOperator.apply(60, 72); } public static void main(String[] args) { LambdaTest test = new LambdaTest(); BinaryOperator binaryOperator = (a, b) -> a*b; System.out.println(“Additon using Lambda BinaryOperator: “+test.lambdaBinaryOpertor(binaryOperator)); } } 在本文中,他们讨论了编译器如何将lambda表达式转换为字节代码。 根据这个文档,lambda表达式转换为static方法和lambda表达式声明的位置,具有lambda static方法的引用。 以下示例位于文章中: //Source code class A { public void foo() { […]