标签: java-8

ZonedDateTime更改行为jdk 8/11

我正在将应用程序从jdk 8迁移到11,我可以看到ZonedDateTime更改是关于夏时制的行为。JDK8

        ZonedDateTime parse = ZonedDateTime.parse("2037-05-10T19:15:00.000+01:00[Europe/Paris]");
        System.out.println(parse);
Run Code Online (Sandbox Code Playgroud)

输出:2037-05-10T19:15 + 02:00 [Europe / Paris]

JDK11 / 12

        ZonedDateTime parse = ZonedDateTime.parse("2037-05-10T19:15:00.000+01:00[Europe/Paris]");
        System.out.println(parse);
Run Code Online (Sandbox Code Playgroud)

2037-05-10T20:15 + 02:00 [欧洲/巴黎]

有人可以向我解释为什么他们会改变这种行为吗?

最好的祝福,

java java-8 zoneddatetime java-11 java-12

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

使用lamda时处理空指针

nullPointerException除非e.getKey()返回,否则以下代码将永远有效null

Map<Integer, Optional<SecurityAttributeChange>> spnCreationDetails;
Optional.ofNullable(spnCreationDetails.get(e.getKey()).orElse(new SecurityAttributeChange()).getNewAttribute())
                                    .orElse(new SecurityAttr())
                                    .getUserName());
Run Code Online (Sandbox Code Playgroud)

我在这一行中正在使用NPE,是否可以调试它?我知道spnCreationDetails.get(e.getKey())返回null,null在这里处理过程中我是否遗漏了什么?


-编辑


这是几乎完整的方法,将有助于提供有关如何重构它以便使其可读的输入。

private void updateAuditFields(List<SecurityAttributeChange> securityChanges, Map<Integer, Map<String, Object>> result) {

    Map<Integer, Optional<SecurityAttributeChange>> spnModificationDetails = ...

    Map<Integer, Optional<SecurityAttributeChange>> spnCreationDetails = ...

    result.entrySet().stream().forEach(e -> {
        e.getValue()
                .put("userIdLastChanged",
                        Optional.ofNullable(Optional.ofNullable(spnModificationDetails.get(e.getKey()))
                                .orElse(Optional.of(new SecurityAttributeChange()))
                                .get()
                                .getNewAttribute()).orElse(new SecurityAttr()).getUserName());

        e.getValue()
                .put("lastChangedDatetime",
                        Optional.ofNullable(Optional.ofNullable(spnModificationDetails.get(e.getKey()))
                                .orElse(Optional.of(new SecurityAttributeChange()))
                                .get()
                                .getNewAttribute()).orElse(new SecurityAttr()).getKnowledgeBeginDate());

        e.getValue()
                .put("userIdCreated", Optional.ofNullable(
                        Optional.ofNullable(spnCreationDetails.get(e.getKey())).orElse(Optional.of(new SecurityAttributeChange())).get().getNewAttribute())
                        .orElse(new SecurityAttr())
                        .getUserName());

        e.getValue()
                .put("createdDatetime",
                        Optional.ofNullable(Optional.ofNullable(spnCreationDetails.get(e.getKey()))
                                .orElse(Optional.of(new SecurityAttributeChange()))
                                .get()
                                .getNewAttribute()).orElse(new SecurityAttr()).getKnowledgeBeginDate());

    });
}
Run Code Online (Sandbox Code Playgroud)

java java-8

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

无法解析Java 8中的构造函数

我想创建一个克隆列表。我正在使用以下代码段,但是即使MyClass具有默认构造函数,我的IDE也会显示“无法解析构造函数”的编译错误。

List<MyClass> clonedList = 
    myClassList.stream().map(MyClass::new).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

我是流媒体新手,如果我的语法错误,请帮助我。

java collections java-8 java-stream

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

在Java 8中使用嵌套的for循环

我在下面的代码中使用嵌套的for循环,并且有一些条件破坏了内部的for循环,这提高了此代码的性能。

public static int getMaxValue(List<Integer> list) {
    int result = -1;
    for(int i=0; i<list.size(); i++) {
        for(int j=i+1; j<list.size(); j++) {
            if(list.get(j) - list.get(i) <= 0) break;
            if(list.get(j) - list.get(i) > result) {
                result = list.get(j) - list.get(i);
            }
        }
    }
    return result;
}
Run Code Online (Sandbox Code Playgroud)

现在如何使用Java 8流执行相同的逻辑?我想出了以下代码:

public static int getMaxValue(List<Integer> list) {
    int[] result = { -1 };
    IntStream.range(0, list.size()).forEach(i -> {
        IntStream.range(i + 1, list.size()).forEach(j -> {
            if(list.get(j) - list.get(i) <= 0) return;

            if(list.get(j) - list.get(i) > result[0]) { …
Run Code Online (Sandbox Code Playgroud)

java java-8

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

我们如何/为什么可以说Java 8中的功能接口是标记接口

在最近的一次采访中,有人问我一个问题:“我们怎么能说java8中的功能接口类似于标记接口”。

我无法回答这个问题。

但是我认为标记甚至没有任何方法,而功能接口必须要覆盖一种方法。

有人可以帮助我理解这是否在某些情况下是有效的论点,或者问题本身是错误的?

java interface marker-interfaces java-8 functional-interface

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

Java BigInteger提供正确的结果

从这篇文章中,我理解的位长bitlength()将给您

此BigInteger的最小2补码表示形式中的位数

但是,当我运行以下程序输出为 0时,我希望此输出为1,因为数字0用一位表示,我很困惑,请帮助

public class Test {
    public static void main(String[] args) {
        int l = BigInteger.valueOf(0L).bitLength();
        System.out.println(l);
    }
}
Run Code Online (Sandbox Code Playgroud)

java biginteger java-8

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

使用Java 8 jar命令从zip归档文件中提取4GB以上的文件时,“无效的CEN标头(错误的签名)”

我有一个包含5个文件的zip文件。其中四个文件很小(几KB),但是一个文件大于4GB。我知道JDK-4681995,它从Java 7开始向Java添加了大文件支持(64位zip支持)。我在Windows 8.1上使用64位Java 8:

C:\Users\user\Desktop>java -version
java version "1.8.0_212"
Java(TM) SE Runtime Environment (build 1.8.0_212-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.212-b10, mixed mode)
Run Code Online (Sandbox Code Playgroud)

压缩文件大小如下:

07/07/2019  10:18 AM       503,966,751 snapshot-20190707.zip
Run Code Online (Sandbox Code Playgroud)

压缩文件的内容为:

07/07/2019  09:53 AM                67 database.sha1
07/07/2019  09:51 AM     4,508,840,068 database.sql
07/07/2019  09:53 AM                74 database_schema.sha1
07/07/2019  09:51 AM            36,386 database_schema.sql
07/07/2019  09:51 AM            45,280 backup.log
Run Code Online (Sandbox Code Playgroud)

如果我尝试提取4GB文件,则会遇到一个异常,该异常看上去64位zip文件Java 7异常完全相同:

C:\Users\user\Desktop>jar xvf snapshot-20190707.zip database.sql
java.util.zip.ZipException: invalid CEN header (bad signature)
        at java.util.zip.ZipFile.open(Native Method)
        at …
Run Code Online (Sandbox Code Playgroud)

java zip jar large-files java-8

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

如何使用Java中的对象正确复制集合

我有一个方法(List<Book> getListWithPrefixInName(List<Book> books)),它接受一个集合作为输入并使用每个集合对象执行一个转换。而且我不希望这些更改反映在已转移的集合上,而只是返回修改后的集合。因为我需要我的原始收藏。

因此,我认为只需创建一个新集合即可复制:

List<Book> clone = new ArrayList<>(books);
Run Code Online (Sandbox Code Playgroud)

但是我怎么错...我的代码:

public class App {

    public static final String PREFIX = "PREFIX";

    public static void main(String[] args) {
        List<Book> books = new ArrayList<>();
        books.add(Book.of(1L, "The Catcher in the Rye"));
        books.add(Book.of(2L, "The Green Mile"));
        List<Book> booksWithPrefix = getListWithPrefixInName(books);

        for (Book book : books) {
            if (book.getName().contains(PREFIX)) {
                System.out.println(String.format("original book: '%s' have been changed", book));
            }
        }
    }

    public static List<Book> getListWithPrefixInName(List<Book> books) {
        List<Book> clone = new ArrayList<>(books);  // I …
Run Code Online (Sandbox Code Playgroud)

java collections clone java-8

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

在Kotlin中getOrElseReturn的可能性

我经常有一个问题Optional和相似的类OptionTryEitherVAVR例如。

假设我有一些Optional,如果它为空,我想立即从一个方法中返回(无例外,因为我的方法Optional也在返回,所以getOrElseThrow不在图片之列),如果存在,我想进一步处理它。

public Optional<Integer> converter() {
  Optional<String> opt = getSomething();

  if(!opt.isPresent())
    return Optional.empty();

  String value = opt.get();  
  // some manipulations on value, such as map and flatMap would cause a huge mess
  return Integer.parseInt(value);  
}
Run Code Online (Sandbox Code Playgroud)

我只需要在值为空的情况下立即返回,就不能建立mapand的链flatMap。整个痛苦都在做.get()。有点像getOrElseThrow,但是用return代替throw会很棒- getOrElseReturn。显然在Java中是不可能的,因此我考虑在Kotlin中尝试此操作。

fun safeOptional(): Optional<Int> {
    val extracted = Optional.of("123")
            .getOrElseReturn { return Optional.empty() }

    val …
Run Code Online (Sandbox Code Playgroud)

java lambda java-8 kotlin

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

如何在Java 8中单行处理列表元素到另一个列表

有列表View2对象,我想添加IdView2对象List<Integer> Ids。我想用单行代码处理以上操作。

class View1{
  List<Integer> Ids;
}
class View2{
  Integer Id;
}

List<View2> views2 = getViews()
Run Code Online (Sandbox Code Playgroud)

想要以下内容。

view1.setIds(view2.forEach(s -> s.getId()));
Run Code Online (Sandbox Code Playgroud)

java collections java-8

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