标签: java-8

使用Java 8将String数组转换为int数组的最简单方法是什么?

我目前正在学习如何使用Java,我的朋友告诉我,使用Java 8时可以简化这段代码.他指出parseIntArray可以简化.你会如何在Java 8中做到这一点?

public class Solution {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        String[] tokens = input.nextLine().split(" ");
        int[] ints = parseIntArray(tokens);
    }

    static int[] parseIntArray(String[] arr) {
        int[] ints = new int[arr.length];
        for (int i = 0; i < ints.length; i++) {
            ints[i] = Integer.parseInt(arr[i]);
        }
        return ints;
    }
}
Run Code Online (Sandbox Code Playgroud)

java arrays java-8 java-stream

13
推荐指数
2
解决办法
1万
查看次数

Eclipse - 安装新的JRE(Java SE 8 1.8.0)

我正在尝试安装Java 8.

到目前为止我做了什么:

我创建项目时得到的错误:

未绑定的类路径容器:项目"JackTest"构建路径问题中的"JRE系统库[JavaSE-1.8]"

任何的想法?有人能告诉我一步一步做什么吗?

java eclipse java-8

13
推荐指数
1
解决办法
10万
查看次数

Java 8:Spliterator,Iterator,Collection和Interfaces中的"默认"实现(名为spliterator的重复方法)

在Java 1.8.0_25发布之后,有一个有趣的情况...我认为我的问题的根源主要与Interfaces中"默认"实现的新(到1.8)功能有关.

我正在开发的应用程序目前的目标是1.7,到目前为止一直运行良好.直到用户开始更新到1.8.现在我们的用户已经开始更新到1.8,我们的手被迫转向1.8支持.

我们已经修复了大部分问题(主要与1.7和1.8之间的JavaFX包的更改有关),但还有一个棘手的问题.

在我的智慧或缺乏中,我不久前决定创建一个从AbstractList <T>扩展的SortedList <T>.到目前为止,这个类运行良好,但是当在1.8运行时运行时,我得到:

Duplicate methods named spliterator with the parameters () and () are inherited 
from the types Collection<T> and Iterable<T>
Run Code Online (Sandbox Code Playgroud)

对我来说,这似乎是由AbstractList <T>实现的一些接口中的"默认"实现引起的(我的SortedList <T>类没有实现除Serializable之外的任何其他接口).实现Serializable是我们的另一个问题,因为我们需要支持SortedList <T>对象的反序列化,没有办法解决这个问题!).

我可以通过在SortedList <T>类中提供spliterator()的覆盖实现来消除错误.但是,如果构建它,它将不再在Java 1.7环境中运行.如果我尝试使用1.7运行时的SortedList <T>,我得到:

Problem:
Error: Unresolved compilation problems:
The import java.util.Spliterator cannot be resolved
Spliterator cannot be resolved to a type

com.xxxx.xxxx.util.SortedList.<init>(SortedList.java:13) 
Run Code Online (Sandbox Code Playgroud)

这个错误非常明显,因为我们现在已经覆盖了SortedList <T>中的spliterator()方法,它需要包含java.util.Spliterator,但1.7中不存在.

理想情况下,如果他们不愿意,我们不希望我们的客户更新到Java 1.8.

我们的手被逼到了吗?我们是否需要强制用户更新到1.8,并为自己更新为1.8的用户推出新版本?

有没有人知道解决这个问题的方法?

在一个更哲学的说明中,为什么接口已被实现损坏:-(.可能是一个漂亮的新功能,但它们确实应该避免做任何会导致对现有代码进行重大更改的事情,特别是在列表如此基本的事情上/收藏等

任何有关这种困境的帮助或建议将不胜感激.

干杯,

标记

interface backwards-compatibility java-8 spliterator

13
推荐指数
1
解决办法
6979
查看次数

IntelliJ IDEA建议用foreach方法替换for循环.我应该尽可能地这样做吗?

IDEA建议替换,例如:

for (Point2D vertex : graph.vertexSet()) {
  union.addVertex(vertex);
}
Run Code Online (Sandbox Code Playgroud)

有了这个:

graph.vertexSet().forEach(union::addVertex);
Run Code Online (Sandbox Code Playgroud)

这个新版本确实更具可读性.但有没有什么情况我最好坚持使用迭代表的旧语言结构而不是使用新foreach方法?

例如,如果我理解正确,方法引用机制意味着构造一个匿名Consumer对象,否则for将不构造(使用语言构造).这会成为某些行为的性能瓶颈吗?

所以我写了这个不是非常详尽的基准:

package org.sample;

import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.Fork;
import org.openjdk.jmh.annotations.Threads;
import org.openjdk.jmh.infra.Blackhole;
import org.tendiwa.geometry.Point2D;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class LanguageConstructVsForeach {
    private static final int NUMBER_OF_POINTS = 10000;
    private static final List<Point2D> points = IntStream
        .range(0, NUMBER_OF_POINTS)
        .mapToObj(i -> new Point2D(i, i * 2))
        .collect(Collectors.toList());

    @Benchmark
    @Threads(1)
    @Fork(3)
    public void languageConstructToBlackhole(Blackhole bh) {
        for (Point2D point : …
Run Code Online (Sandbox Code Playgroud)

java foreach intellij-idea java-8

13
推荐指数
1
解决办法
7658
查看次数

使用lambda在Java流中调用带有参数的构造函数

我想调用MySortedSet的构造函数,它将Comparator c作为参数.我该如何修改呢?

public MySortedSet<E> subSet(E fromElement, E toElement) {
     return list.stream()
            .filter(x -> (list.indexOf(x) <= list.indexOf(fromElement)
                    && list.indexOf(x) < list.indexOf(toElement)))
            .collect(Collectors.toCollection(MySortedSet<E> :: new));
}
Run Code Online (Sandbox Code Playgroud)

java lambda java-8 java-stream

13
推荐指数
1
解决办法
8534
查看次数

java.time:CET时区是否考虑夏令时?

我使用java.timeJava 8 的新实现,对UTC到CET时间转换结果的输出感到惊讶.

ZonedDateTime utcTime = ZonedDateTime.of(2014, 7, 1, 8, 0, 0, 0, ZoneId.of("UTC"));
ZonedDateTime cetTime = ZonedDateTime.ofInstant(utcTime.toInstant(), ZoneId.of("CET"));
System.out.println("Summer-UTC-Time: " + utcTime);
System.out.println("Summer-CET-Time: " + cetTime);

System.out.println();

utcTime = ZonedDateTime.of(2014, 1, 1, 8, 0, 0, 0, ZoneId.of("UTC"));
cetTime = ZonedDateTime.ofInstant(utcTime.toInstant(), ZoneId.of("CET"));
System.out.println("Winter-UTC-Time: " + utcTime);
System.out.println("Winter-CET-Time: " + cetTime);
Run Code Online (Sandbox Code Playgroud)

我预计CET时间总是+1时间,但我得到了:

Summer-UTC-Time: 2014-07-01T08:00Z[UTC]
Summer-CET-Time: 2014-07-01T10:00+02:00[CET] -> +2 **Unexpected**

Winter-UTC-Time: 2014-01-01T08:00Z[UTC]
Winter-CET-Time: 2014-01-01T09:00+01:00[CET] -> +1 Expected
Run Code Online (Sandbox Code Playgroud)

显然我必须处理夏令时,这是我在使用CET时没想到的.是java.timeCET真理CEST?如果是的话,如果我需要CET,我应该使用哪个区域?

java java-8 java-time

13
推荐指数
1
解决办法
1万
查看次数

getDeclaredMethods()在Java 7与Java 8中的表现不同

考虑以下小例子:

package prv.rli.codetest;

import java.lang.reflect.Method;

public class BreakingInterfaces  {
    interface Base {
        BaseFoo foo();
        interface BaseFoo {           
        }
    }

    interface Derived extends Base {
        DerivedFoo foo();
        interface DerivedFoo extends BaseFoo {

        }
    }

    public static void main(String[] args) {       
        dumpDeclaredMethods(Derived.class);
    }

    private static void dumpDeclaredMethods(Class<?> class1) {
        System.out.println("---" + class1.getSimpleName() + "---");
        Method[] methods = class1.getDeclaredMethods();
        for (Method method : methods) {
            System.out.println(method);
        }
        System.out.println("----------");
    }
}
Run Code Online (Sandbox Code Playgroud)

如果使用jdk1.7.0.55编译上面的示例,则输出为:

 ---Derived---
public abstract BreakingInterfaces$Derived$DerivedFoo BreakingInterfaces$Derived.foo()
----------
Run Code Online (Sandbox Code Playgroud)

但是当使用jdk1.8.0.25时,输出是:

---Derived---
public abstract prv.rli.codetest.BreakingInterfaces$Derived$DerivedFoo prv.rli.codetest.BreakingInterfaces$Derived.foo() …
Run Code Online (Sandbox Code Playgroud)

java java-8

13
推荐指数
1
解决办法
1002
查看次数

为什么@FunctionalInterface具有RUNTIME保留?

在Javadoc中说:

如果使用此批注类型对类型进行批注,则编译器需要生成错误消息,除非......

为什么不是SOURCE或CLASS不够@Override.

java java-8

13
推荐指数
1
解决办法
451
查看次数

仅使用一个元素在列表上调用stream().reduce()

我是java中函数式编程的新手,并且想知道如何在(例如)此操作中编写代码来避免NPE:

myList.stream()
      .reduce((prev, curr) -> prev.getTimestamp().isAfter(curr.getTimestamp()) ? prev : curr);
      .get().getTimestamp();
Run Code Online (Sandbox Code Playgroud)

我的目的是找到列表中最新对象的时间戳.关于如何更好地收集最后一个元素的建议非常受欢迎,但我的主要问题实际上是为什么这个有效.

文档说该函数抛出NullPointerException"如果减少的结果为空":

http://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#reduce-java.util.function.BinaryOperator-

这没关系,但是我不太明白为什么NullPointerException当这个代码运行时只包含一个元素的列表时我没有得到.prev在这种情况下,我预计会为空.我试过调试,但是当只有一个元素时,它似乎只是跨过整个lambda表达式.

java collections null functional-programming java-8

13
推荐指数
2
解决办法
7381
查看次数

java 8嵌套流

假设你有这样的结构类:

public class Review{
    private Integer idReview;
    private String description;
    private ArrayList<RelReviewImage> images;
}

public class RelReviewImage{
    private Integer idRelReviewImage;
    private Integer idImage;
    private String name;
}
Run Code Online (Sandbox Code Playgroud)

使用Java 8和Streams,我们希望对对象进行过滤idImage并返回Review对象.
可能吗?一个级别很容易,但是我们找不到任何示例或文档的2个级别.

lambda java-8 java-stream

13
推荐指数
2
解决办法
2万
查看次数