标签: java-8

Java 8:对[方法]的引用含糊不清

有没有人理解为什么以下代码在Java 7及更低版本中可以正常编译,但是在Java 8中失败了.

public static void main(String[] args) throws Exception {
    put(get("hello"));
}

public static <R> R get(String d) {
    return (R)d;
}

public static void put(Object o) {
    System.err.println("Object " + o);
}

public static void put(CharSequence c) {
    System.err.println("CharSequence " + c);
}

public static void put(char[] c) {
    System.err.println("char[] " + c);
}
Run Code Online (Sandbox Code Playgroud)

get方法具有泛型返回类型.在JDK 7及更低版本中,这将编译精细,并选择带有Object参数的put方法.在JDK 8中,这无法编译,表明put方法不明确.

显然JDK 8正在跳过Object-parameter方法并找到最后两个子Object-parameter方法并抱怨它们(即如果你添加另一个put方法和其他一些参数类型,编译器将切换并抱怨新的last两种方法)

这似乎是一个错误.

java generics compiler-errors java-8

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

如何知道我机器上的jdk版本?

我最近卸载了JDK 11并安装了JDK 8。为了确认,我想检查我的Windows 10机器上安装了哪个 JDK 。我输入java -versioncmd 然后收到错误消息

java 不被识别为内部或外部命令

问题:如何知道电脑上安装了哪个JDK版本?

java java-8

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

Java 7和Java 8可以在OSX上共存

我已经安装了Java 8用于开发目的,但现在我想再次使用Java 7.

我该怎么做呢?

这似乎非常困难.

提前谢谢了.(我尝试使用guigarage,但这不起作用)

java macos java-8

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

Java 8 java.time:在Instant vs LocalDateTime中添加TemporalUnit

我正在使用Java 8中的新java.time包.我有一个遗留数据库,它给了我java.util.Date,我转换为Instant.

我想要做的是添加一段基于另一个数据库标志的时间.我可以添加几天,几周,几个月或几年.我不想关心我要添加的内容,我希望将来能够添加更多选项.

我的第一个想法是Instant.plus(),但这给了我一个UnsupportedTemporalTypeException超过一天的价值.Instant显然不支持大单位时间的操作.好的,无论如何LocalDateTime.

所以这给了我这个代码:

private Date adjustDate(Date myDate, TemporalUnit unit){
    Instant instant = myDate.toInstant();
    LocalDateTime dateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
    dateTime = dateTime.plus(1, unit);
    Instant updatedInstant = dateTime.atZone(ZoneId.systemDefault()).toInstant();
    return new Date(dueInstant.toEpochMilli());
}
Run Code Online (Sandbox Code Playgroud)

现在,这是我第一次使用新的时间API,所以我可能在这里错过了一些东西.但是我必须离开这似乎很笨重:

Date --> Instant --> LocalDateTime --> do stuff--> Instant --> Date.
Run Code Online (Sandbox Code Playgroud)

即使我不必使用Date部分,我仍然认为它有点尴尬.所以我的问题是,我这样做完全错了,最好的办法是什么?


编辑:扩展评论中的讨论.

我想我现在更好地了解了LocalDateTime和Instant如何使用java.util.Date和java.sql.Timestamp.感谢大家.

现在,更实际的考虑.假设用户向我发送了他们在世界任何地方的日期,任意时区.他们发给我2014-04-16T13:00:00我可以解析的LocalDateTime.然后我将它直接转换为java.sql.Timestamp并在我的数据库中保留.

现在,我没有做任何其他事情,我从我的数据库中提取我的java.sql.timestamp,转换为LocalDateTime使用timestamp.toLocalDateTime().都好.然后我使用ISO_DATE_TIME格式将此值返回给我的用户.结果是2014-04-16T09:00:00.

我认为这种差异是因为某种类型的隐式转换到/来自UTC.我认为我的默认时区可能会应用于该值(EDT,UTC-4),这可以解释为什么数字关闭4小时.

新问题.从本地时间到UTC的隐式转换在哪里?保留时区的更好方法是什么.我不应该直接从当地时间作为字符串(2014-04-16T13:00:00)来LocalDateTime?我应该期待用户输入的时区吗?

java java-8 java-time

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

JDK 8 update 20中是否存在类型推断回归?

我有以下代码的问题:

public static <T> T firstNonNull(@Nullable T first, @Nullable T second) {
    return first != null ? first : second;
}

public static Set<String> getStrings() {
   return new HashSet<>();
}

public static Set<String> doesNotCompile = firstNonNull(getStrings(), new HashSet<>());
Run Code Online (Sandbox Code Playgroud)

使用JDK 8直到更新11,此代码编译.使用JDK 8 update 20,它不再编译.在最后一个语句中,我必须显式指定String最后一个HashSet实例化的类型参数.

我想知道这个代码是否错误,或者它是否是最后一次JDK更新中的回归.

java java-8

25
推荐指数
1
解决办法
817
查看次数

在Java语法中::的含义

以下代码中::的含义是什么?

Set<String> set = people.stream()
                        .map(Person::getName)
                        .collect(Collectors.toCollection(TreeSet::new));
Run Code Online (Sandbox Code Playgroud)

java syntax java-8

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

Java中的闭包 - 捕获的价值 - 为什么会出现这种意外结果?

我想我已经在JavaScript中遇到了这种经典情况.

通常程序员会希望下面的代码可以打印"Peter","Paul","Mary".

但事实并非如此.谁能解释为什么它在Java中以这种方式工作?

这个Java 8代码编译好并打印3次"Mary".

我想这是一个问题,它是如何在内心深处实施的,
但是......这不是表明底层实施的错误吗?

import java.util.List;
import java.util.ArrayList;

public class Test008 {

    public static void main(String[] args) {
        String[] names = { "Peter", "Paul", "Mary" };
        List<Runnable> runners = new ArrayList<>();

        int[] ind = {0};
        for (int i = 0; i < names.length; i++){ 
            ind[0] = i;
            runners.add(() -> System.out.println(names[ind[0]]));
        }

        for (int k=0; k<runners.size(); k++){
            runners.get(k).run();
        }

    }

}
Run Code Online (Sandbox Code Playgroud)

相反,如果我使用增强的for循环(同时添加Runnables),则捕获正确的(即所有不同的)值.

for (String name : names){
    runners.add(() -> System.out.println(name));
}
Run Code Online (Sandbox Code Playgroud)

最后,如果我使用经典的for循环(同时添加Runnables),那么我会得到一个编译错误(这很有意义,因为变量i不是最终的或有效的最终).

for (int i = …
Run Code Online (Sandbox Code Playgroud)

java lambda closures java-8

25
推荐指数
4
解决办法
3390
查看次数

流分组:减少到列表的第一个元素

我有一个List<Valuta>可以表示(简化)JSON风格:

[{codice = EUR,description = Euro,ratio = 1},{codice = USD,description = Dollars,ratio = 1.1}]

我想用这样的方式改变它Map<String, Valuta>:

{EUR = {codice = EUR,description = Euro,ratio = 1},USD = {codice = USD,description = Dollars,ratio = 1.1}}

我写了这个单行:

getValute().stream().collect(Collectors.groupingBy(Valuta::getCodice));
Run Code Online (Sandbox Code Playgroud)

但这会返回一个Map<String, List<Valuta>>而不是我需要的东西.

我认为mapping()功能对我有用,但不知道如何.

java grouping java-8 java-stream collectors

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

连接字符串值和分隔符在java 8中处理null和空字符串?

在Java 8中,我有一些String值,我想以逗号分隔的有效值列表结束.如果String为null或为空,我想忽略它.我知道这似乎很常见,很像这个老问题 ; 但是,该讨论没有解决空值和空格(我也不喜欢接受的答案).

我看过Java 8 StringJoiner,commons StringUtils(join)和trusty guava(Joiner),但似乎没有一个完整的解决方案.愿景:

 where: val1="a", val2=null, val3="", val4="b"

  String niceString = StringJoiner.use(",").ignoreBlanks().ignoreNulls()
    .add(val1).add(val2).add(val3).add(val4).toString();
Run Code Online (Sandbox Code Playgroud)

会导致niceString ="a,b"

是不是有一个很好的方法来做到这一点(不涉及循环,将字符串加载到列表中,和/或正则表达式替换以删除错误的条目)?

java guava apache-stringutils java-8

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

lambda表达式可以替代多态吗?

我正在学习lambda表达式和功能接口.我们可以通过lambda表达式直接编写接口的实现.所以我认为,它可能是多态性的替代品.

我有一些使用多态的代码,

interface Drawable {
    public void draw();
}


class Shape {

    protected String name;

    public Shape(String name) {
        this.name = name;
    }
}

class Rectangle extends Shape implements Drawable  {

    public Rectangle(String name) {
        super(name);
    }

    @Override
    public void draw() {
        System.out.println("I am "+this.name);
        System.out.println("Drawing rectangle with 2 equal sides.");
    }
}

class Square extends Shape implements Drawable {

    public Square(String name) {
        super(name);
    }

    @Override
    public void draw() {
        System.out.println("I am "+this.name);
        System.out.println("Drawing square with 4 equal sides."); …
Run Code Online (Sandbox Code Playgroud)

java lambda java-8

25
推荐指数
1
解决办法
1851
查看次数