Tag: java 8

Java 8中的Functional Interface有什么用?

我在Java 8中遇到了一个名为“Functional Interface”的新术语。 在使用Lambdaexpression式时,我只能find这个接口的一个用法。 Java 8提供了一些内置的function接口,如果我们想要定义任何function接口,那么我们可以使用@FunctionalInterface注解。 它将允许在界面中声明唯一的方法。 例如: @FunctionalInterface interface MathOperation { int operation(int a, int b); } 它在Java 8中有多有用(与使用Lambdaexpression式不同)? 这里的问题与我所问的不一样。 这是问为什么我们需要function接口,同时使用Lambdaexpression式。 我的问题是使用除Lambdaexpression式以外的function接口。

Lambdaexpression式和方法重载疑惑

好的,所以方法重载是一件坏事。 现在,这已经解决了,让我们假设我真的想重载像这样的方法: static void run(Consumer<Integer> consumer) { System.out.println("consumer"); } static void run(Function<Integer, Integer> function) { System.out.println("function"); } 在Java 7中,我可以用非歧义的匿名类作为参数轻松地调用它们: run(new Consumer<Integer>() { public void accept(Integer integer) {} }); run(new Function<Integer, Integer>() { public Integer apply(Integer o) { return 1; } }); 现在在Java 8中,我想用lambdaexpression式来调用这些方法,我可以! // Consumer run((Integer i) -> {}); // Function run((Integer i) -> 1); […]

Word频率计数Java 8

如何计算Java 8中List的单词频率? List <String> = Lists.newArrayList("hello", "bye", "ciao", "bye", "ciao"); 结果必须是: {ciao=2, hello=1, bye=2}

将java.time.LocalDate转换为java.util.Datetypes

我想将java.time.LocalDate转换为java.util.Datetypes。 因为我想将date设置为JDateChooser 。 还是有任何支持java.timedate的dateselect器?

Java 8date时间API(java.time)和Joda-Time之间的区别

我知道有关于java.util.Date和Joda-Time的问题。 但经过一番挖掘,我找不到有关java.time API (由JSR 310定义的Java 8中的新增内容)与Joda-Time之间的差异的线索 。 我听说Java 8的java.time API比Joda-Time要干净得多。 但是我找不到比较两者的例子。 什么时候可以做Java的Joda时间不能? java.time能比Joda-Time做得更好吗? java.time的性能更好吗?

Java-8中“function接口”的精确定义

最近我开始研究Java 8,我不能完全理解Java实现lambdaexpression式所必需的“function接口”的概念。 在Java中有一个非常全面的 lambda函数的指南 ,但是我陷入了定义函数接口概念的章节 。 定义如下: 更确切地说,一个function接口被定义为只有一个抽象方法的任何接口。 然后他继续举例,其中一个是“比较器”界面: public interface Comparator {int compare(T o1,T o2); boolean equals(Object obj); } 我能够testing,我可以使用lambda函数来代替Comparator参数,它的工作原理(即Collections.sort(list, (a, b) -> ab) )。 但是在Comparator接口中,compare()和equals()方法都是抽象的,这意味着它有两个抽象方法 。 那么如果定义需要一个接口只有一个抽象方法 ,那么这怎么可能呢? 我在这里错过了什么?

复制stream以避免“stream已经被操作或closures”(Java 8)

我想复制一个Java 8stream,以便我可以处理它两次。 我可以collect一个列表,并从中获得新的stream; // doSomething() returns a stream List<A> thing = doSomething().collect(toList()); thing.stream()… // do stuff thing.stream()… // do other stuff 但我认为应该有一个更高效/优雅的方式。 有没有办法复制stream而不把它变成一个集合? 实际上,我正在处理任意一个stream,所以我们需要先处理左侧的投影,然后再移动到正确的投影中,然后用另一种方式处理。 有点像这样(到目前为止,我不得不使用toList技巧)。 List<Either<Pair<A, Throwable>, A>> results = doSomething().collect(toList()); Stream<Pair<A, Throwable>> failures = results.stream().flatMap(either -> either.left()); failures.forEach(failure -> … ); Stream<A> successes = results.stream().flatMap(either -> either.right()); successes.forEach(success -> … );

这是Files.lines()中的错误,还是我误解了一些关于并行stream的问题?

环境:Ubuntu x86_64(14.10),Oracle JDK 1.8u25 我尝试使用Files.lines()并行stream,但我想.skip()的第一行(这是一个带有标题的CSV文件)。 所以我尝试这样做: try ( final Stream<String> stream = Files.lines(thePath, StandardCharsets.UTF_8) .skip(1L).parallel(); ) { // etc } 但是,然后一列未能parsing为int … 所以我尝试了一些简单的代码。 该文件是问题是死的简单: $ cat info.csv startDate;treeDepth;nrMatchers;nrLines;nrChars;nrCodePoints;nrNodes 1422758875023;34;54;151;4375;4375;27486 $ 代码同样简单: public static void main(final String… args) { final Path path = Paths.get("/home/fge/tmp/dd/info.csv"); Files.lines(path, StandardCharsets.UTF_8).skip(1L).parallel() .forEach(System.out::println); } 我系统地得到以下结果(好吧,我只运行了大约20次): startDate;treeDepth;nrMatchers;nrLines;nrChars;nrCodePoints;nrNodes 我在这里错过了什么? 编辑看起来像这个问题,或误解,比这更深植根于下面的两个例子(FreeNode的## java的一个研究员煮熟): public static void […]

Java Lambda Stream Distinct()上的任意键?

我经常遇到一个Java lambdaexpression式的问题,当我想在一个对象的任意属性或方法上使用distinct()stream时,但是想保留该对象而不是将其映射到该属性或方法。 我开始创build这里讨论的容器,但是我已经开始做足够多的工作,变得烦人,并且做了很多样板类。 我把这个Pairing类放在一起,这个类包含两个types的两个对象,并允许你指定closures左边,右边或两个对象。 我的问题是…真的没有内置的lambdastream函数distinct()在某种关键供应商? 那真让我感到吃惊。 如果不是,这个class级能否可靠地履行这个职能? 这是如何被调用的 BigDecimal totalShare = orders.stream().map(c -> Pairing.keyLeft(c.getCompany().getId(), c.getShare())).distinct().map(Pairing::getRightItem).reduce(BigDecimal.ZERO, (x,y) -> x.add(y)); 这是配对类 public final class Pairing<X,Y> { private final X item1; private final Y item2; private final KeySetup keySetup; private static enum KeySetup {LEFT,RIGHT,BOTH}; private Pairing(X item1, Y item2, KeySetup keySetup) { this.item1 = item1; this.item2 = item2; […]

Java8:为什么禁止从java.lang.Object中定义一个方法的默认方法

默认的方法在我们的Java工具箱中是一个很好的新工具。 但是,我试图编写一个接口来定义toString方法的default版本。 Java告诉我这是被禁止的,因为在java.lang.Object声明的方法可能不是default 。 这是为什么? 我知道有“基类总是赢”的规则,所以在默认情况下(双关语), Object方法的任何default实现将被来自Object的方法覆盖。 但是,我没有看到为什么在规范中不应该有Object方法的exception。 特别是对于toString ,有一个默认的实现可能是非常有用的。 那么,Javadevise者为什么决定不允许default方法从Object覆盖方法的原因是什么呢?