Tag: java 8

为什么不排序(Comparator :: reverseOrder)有效?

以下Stream表达式完美无缺: Stream s = Stream.of(“yellow”,”blue”, “white”); s.sorted(Comparator.reverseOrder()) .forEach(System.out::print);` //yellowwhiteblue 为什么没有与方法引用相同的编译? s.sorted(Comparator::reverseOrder).forEach(System.out::print); Comparator类型不定义此处适用的reverseOrder(String,String)

Java流API将lambda表达式存储为变量

这个标题对我来说听起来很愚蠢,但必须至少有一些聪明的方法才能达到这样的效果,我不知道如何解释它。 我需要使用sorted in stream API对数组进行排序。 到目前为止,这是我的流: Arrays.stream(sequence.split(” “)) .mapToInt(Integer::parseInt) .boxed() .sorted((a, b) -> a.compareTo(b)) .forEach(a -> System.out.print(a + ” “)); 现在我有两种不同的过程 – 升序和降序,我需要使用的排序在用户输入中指定。 所以我想要做的就是切换2个案例:“升序”和“降序”以及分别存储lambda表达式的变量: switch(command) { case “ascending”: var = a.compareTo(b); case “descending”: var = b.compareTo(a); } 然后我的排序看起来像: .sorted((a, b) -> var) 我在参加的python课程中得到了这个想法。 在那里可以将对象存储在变量中,从而使变量“可执行”。 我意识到这个lambda不是一个对象,而是一个表达式,但我要问的是有什么聪明的方法可以达到这样的结果,或者我应该只有 if(var) 和每个排序顺序的两个不同的流。

Java 8接口/类加载器有变化吗?

我发现Java 1.7_51和Java 1.8_20之间存在一些困难。 最初的情况: 一个界面: interface InterfaceA { public void doSomething(); } 两个class: public class ClassA implements InterfaceA { public void doSomething() { System.out.println(“Hello World!”); } } public class ClassB { public static void main(String[] args) { ClassA a = new ClassA(); a.doSomething(); } } 接下来我在编译完成后用(Java 1.8) – > javac * .java编译了类,我删除了InterfaceA.java和InterfaceA.class文件。 现在我再次尝试编译只有ClassB.java并得到错误消息: ClassB.java:4:错误:无法访问InterfaceA a.doSomething(); […]

如何在Java 8中创建漂亮的迭代

受Adam Bien的博客启发,我想用Java 8将Java 7中的常见迭代替换为更好的迭代。旧代码看起来像这样: void repeatUsingJava7(int times) { for (int i = 0; i < times; i++) { doStuff(); doMoreStuff(); doEvenMoreStuff(); } } ……这不太好。 所以我用Adam Bein的例子替换了它: void repeatUsingJava8(int times) { IntStream.range(0, times).forEach( i -> { doStuff(); doMoreStuff(); doEvenMoreStuff(); } ); } …这是向正确方向迈出的一步,但不会使代码更易于阅读,还会引入一个不需要的变量i ,以及一对额外的花括号。 所以现在我想知道是否有其他方法来编写这个代码,这将使它更好,更容易阅读,主要是使用Java 8。

在Java 8的Spliterator中使用的奇怪循环

有人知道为什么java.util.Spliterator实现使用do-while而不是while循环,当循环体是空的时候? 例如, forEachRemaining的实现是: default void forEachRemaining(Consumer action) { do { } while (tryAdvance(action)); } 他们为什么要用 do { } while (tryAdvance(action)); 代替 while(tryAdvance(action)); ? 我不知道有什么好处吗?

如何声明方法引用数组?

我知道如何以这种方式声明其他东西的数组,比如字符串: String[] strings = { “one”, “two”, “tree” }; // or String[] strings = new String[] { “one”, “two”, “tree” }; 但是当谈到方法引用时,我无法弄清楚如何避免创建列表并单独添加每个项目。 示例:在两个来源的几个不同匹配列表上调用方法smartListMerge : List<Function> listGetters = new ArrayList(3); listGetters.add(TodoUser::getPendingList); listGetters.add(TodoUser::getCompletedList); listGetters.add(TodoUser::getWishList); TodoUser userA = …, userB = …; for (Function listSupplier : listGetters) { TodoList sourceList = listSupplier.apply(userA); TodoList destinationList = listSupplier.apply(userB); smartListMerge(sourceList, destinationList); […]

如何在java中以ISO日期格式打印当前时间和日期?

我应该以ISO格式发送当前日期和时间,如下所示: ‘2018-02-09T13:30:00.000-05:00’ 我写了以下代码: Date date = new Date(); SimpleDateFormat formatter = new SimpleDateFormat(“yyyy-MM-dd’T’HH:mm”); SimpleDateFormat formatter1 = new SimpleDateFormat(“yyyy-MM-dd’T’HH:mm:ss.000’Z'”); System.out.println(formatter.format(date)); System.out.println(formatter1.format(date)); 它以下列方式打印: 2018-04-30T12:02 2018-04-30T12:02:58.000Z 但它不是以上述格式打印。 如何获得格式中显示的-5:00以及它表示什么?

Java:使用lambda为文件添加行号的优雅方法

我习惯使用lambda逐行解析文件(比bufferedReader.readLine()更整洁)。 但今天我遇到了一个问题:为每一行添加一个行号。 它需要一个计数器,但lambda中的变量应该是最终的。 最后,我用一个int数组攻击它。 码: public static void main(String[] args) { int[] counter = new int[1]; counter[0] = 0; try (Stream lines = Files.lines(Paths.get(“/tmp/timeline.txt”), Charset.defaultCharset())) { lines.limit(10).forEachOrdered(line -> { line = line.trim(); counter[0] ++; System.out.println(“Line ” + counter[0] + “: ” + line); }); } catch (IOException e) { e.printStackTrace(); } } 输出: Line 1: […]

invokestatic on interface中的静态方法

反汇编一些Java 8代码我发现一些对接口中静态方法的invokestatic调用(特别是java.util.function.Function.identity() )在const pool中使用了InterfaceMethodRef; 这就是javap -s -c -vp向我展示的内容: 15: invokestatic #66 // InterfaceMethod java/util/function/Function.identity:()Ljava/util/function/Function; 根据JVM 8规范,这是不可能的,当我在带有Java 7 major version=51 ( major version=51 )的classfile中使用此指令时,它已在此指令上抛出VerifyError。 然而,当我将主要版本更改为52 ,它开始像魅力一样工作。 请注意,我在Oracle JDK 1.8.0_60上运行。 我想知道为什么需要这个更改(调用的方法是静态链接的,不是吗?)以及是否记录在任何地方。

Java ZonedDateTime到即时转换

我计划按照以下逻辑将ZonedDateTime转换为即时。 说,我在PST时区,目前的时间是11A.M. 如果我现在转换(截至2018年3月4日没有夏令时),toInstant将是7P.M. 对于同样的上午11点,toInstant将在2018年4月4日下午6点返回,因为将观察到夏令时。 所以,下面的代码正确返回。 ZonedDateTime dateTime = ZonedDateTime.now(); —>>> March 04th 2018 at 11 AM PST dateTime.plusMonths(1).toInstant(); –>> returns April 04th 2018 at 6 PM PST as daylight saving will be observed 但, 如果我转换为Instant然后再添加一个月,结果将会有所不同。 Instant dateTime = ZonedDateTime.now().toInstant(); —>>> March 04th 2018 at 7 PM UTC dateTime.plus(1,ChronoUnit.MONTHS).toInstant(); –>> returns April 04th 2018 at 7 […]