标签: java-8

Java 8 和 11 之间相同语言环境的不同分组分隔符

我正在根据语言和地区设置区域设置,并希望使用此设置解析 BigDecimal 数字。但我面临的问题是两个 OpenJDK 的分组分隔符不同。

下面是我尝试使用 OpenJDK 8 和 OpenJDK 11 执行的示例代码。

Locale l = new Locale.Builder().setLanguage("de").setRegion("CH").build();
System.out.println("Locale set to " + Locale.getDefault(Locale.Category.FORMAT));
DecimalFormat nf = (DecimalFormat)NumberFormat.getInstance(Locale.getDefault(Locale.Category.FORMAT));
System.out.println("Grouping Separator: " + nf.getDecimalFormatSymbols().getGroupingSeparator());
Run Code Online (Sandbox Code Playgroud)

输出

OpenJDK 8
---------
Locale set to de_CH
Grouping Separator: '


OpenJDK 11
----------
Locale set to de_CH
Grouping Separator: ’
Run Code Online (Sandbox Code Playgroud)

我需要一个通用的解析方法,其中分组分隔符返回相同,以便设计我的单元测试很容易,并且无论是使用 java 8 还是 11 运行它都会通过。请协助。

java locale java-8 java-11 openjdk-11

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

删除多个列表中的重复元素java 8

我有三个字符串列表。现在我需要确保一个元素只出现在这三个列表之一中。我不想在列表中重复。您可以假设每个列表中没有重复项。

我尝试使用removeIf()及其服务于我的目的。我确定这不是最好的方法。在 Java 8+ 中有没有其他方法可以做到这一点?

列表的优先级是 list1 > list2 > list3

List<String> list1 = Stream.of("23","45","655","43","199").collect(Collectors.toList());
List<String> list2 = Stream.of("13","23","54","655","111","13").collect(Collectors.toList());
List<String> list3 = Stream.of("76","45","33","67","43","13").collect(Collectors.toList());

list2.removeIf(i->list1.contains(i));
list3.removeIf(i->list1.contains(i) || list2.contains(i));

System.out.println(list1);
System.out.println(list2);
System.out.println(list3);
Run Code Online (Sandbox Code Playgroud)

输出低于预期

[23, 45, 655, 43, 199]
[13, 54, 111, 13]
[76, 33, 67]
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

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

Java流api使用链内原始对象的引用

我正在尝试从列表创建一个 Map,而 Map 的值将是某种转换的结果,这就是我的代码的样子。

empIdList.stream()
         .map(id-> getDepartment(id))
         .collect(Collectors.toMap(id, department:String -> department)
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,我希望将其id用作键和department值。你能帮我实现我的预期结果吗?

java lambda java-8 java-stream

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

将一种枚举类型转换为另一种枚举类型的通用方法

我有两个枚举如下

第一的

public enum firstEnum {
    ALL_PRODUCT,
    SPECIFIC_COLLECTION,
    SPECIFIC_PRODUCT
}
Run Code Online (Sandbox Code Playgroud)

第二

public enum secondEnum {
    PRODUCT,
    COLLECTION,
    PRODUCT
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试创建一个通用方法来将一种类型转换为另一种类型,如下所示

public record EnumCasting() {
    public <E1,E2> E2 CastOneEnumToAnother(E1 enumFirst, E2 enumSecond) {
         return // some logic to convert
    }
}
Run Code Online (Sandbox Code Playgroud)

不知道我怎么能做到这一点,任何帮助将不胜感激。 firstEnum.ALL_Product should return secondEnum.Product, firstEnum.SPECIFIC_COLLECTION should return secondEnum.COLLECTION

java generics enums java-8

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

AtomicInteger a1 在 a2 之前增加,在 a2 之后减少,为什么存在 a2 &gt; a1

有代码:

        AtomicInteger a1 = new AtomicInteger();
        AtomicInteger a2 = new AtomicInteger();
        for (int i = 0; i < 100; i++) {
            new Thread(()->{
                for (int j = 0; j < 1e4; j++) {
                    a1.incrementAndGet();
                    a2.incrementAndGet();
                    int v2 = a2.decrementAndGet();
                    if(v2>a1.get()){
                        System.out.println("error a2 > a1");
                    }
                    a1.decrementAndGet();
                }
            }).start();
        }
Run Code Online (Sandbox Code Playgroud)

为什么存在 println error a2 > a1

谢谢!

行动 a1 a2
a1+ 1 0
a2+ 1 1
a2- 1 0
a1- 0 0

redhat windows openjdk-1.8.0.222

java jvm atomic java-8

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

如何在 Java 8 Streams 中使用小写或大写映射?

我正在使用 java 流,但遇到了问题。我有这个代码:

clients.stream()
                    .map(Client::getDescription)
                    .map(x -> x.substring(x.lastIndexOf("_v")))
                    .map(x -> x.substring(2))
                    .mapToInt(Integer::parseInt)
                    .max()
                    .getAsInt();
Run Code Online (Sandbox Code Playgroud)

每个客户端的描述可能是“John_abc_v1”、“Bill_crce_v2”、“Joe_ghhj_V3”……我得到了最大值,在这种情况下是 3……但问题是 v 可以是小写或大写,而我没有知道如何解决,所以这行不工作 .map(x -> x.substring(x.lastIndexOf("_v"))),我得到String index out of range -1的时候“V”是大写的。我该如何解决?任何反馈都将受到赞赏。

java string java-8 java-stream

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

如何以给定格式获取日期?

这是我想要做的:

  1. 取今天的日期(比如 2021-07-07)
  2. 将其格式化为 (2021-07-07T00:00:00.000Z)
  3. 在 API 中发送

我找不到一种简单的方法来转换2021-07-072021-07-07T00:00:00.000Z. 我们当然可以附加T00:00:00.000Z字符串,但我想避免这种情况。

到目前为止,我拥有的每种方法(使用 LocalDate、LocalDateTime、Instant、Date)都涉及使用时区 (ZoneId) 或转​​换为 Epoch,它们最终只给出响应直到几秒钟而不是几毫秒。

我相信一定有更简单的方法。

编辑 1:传递区域 ID 不是问题,我们可以做到。

java java-8

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

从 JDK8 迁移到 JDK11 导致 java.lang.UnsupportedOperationException

我正在将我的一个项目从 JDK8 迁移到 JDK11,但是其中一个单元测试失败了,尽管我想出了如何在 JDK11 中解决此问题的解决方案,但我不知道其背后的原因。如果有人向我解释这一变化,我真的很感激。这是适用于 JDK8 但不适用于 JDK11 的 HashSet:

Set<String> func(Properties p, String s) {
    Set<String> set = p.stringPropertyNames();
    set.removeIf(s -> !s.startsWith(s));
    return set;
}
Run Code Online (Sandbox Code Playgroud)

我不得不像这样更改 HashSet 初始化以使我的测试运行并通过 JDK11:

Set<String> set = new HashSet<>(p.stringPropertyNames());
Run Code Online (Sandbox Code Playgroud)

我不明白为什么我必须在 JDK11 中像这样更改初始化,此更改是否打算在 JDK11 中使用?

错误堆栈跟踪:

null
java.lang.UnsupportedOperationException
at java.base/java.util.Collections$UnmodifiableCollection.removeIf(Collections.java:1089)
Run Code Online (Sandbox Code Playgroud)

java collections hashset java-8 java-11

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

在 Java Map 中为每个键分配多个值

Map在 Java 中创建标准很容易。

Map<Integer, String> map = new HashMap<>();
map.put(1, "Name 1");
map.put(2, "Name 2");
Run Code Online (Sandbox Code Playgroud)

现在我需要“扩展”这种标准映射方法,以便每个键可以表示多个值,例如:

Map<Integer, String, String, String> map = new HashMap<>();
map.put(1, "Name 1", "Address 1", "ZIP Code 1");
map.put(2, "Name 2", "Address 2", "ZIP Code 2");
Run Code Online (Sandbox Code Playgroud)

是否有任何“标准”实现或库提供这样的功能?我知道例如 Apache Commons MultiValuedMap( https://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/MultiValuedMap.html ) 但这似乎不适合上述用途案件。

java java-8

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

在java 8中查找具有给定属性最大长度的字符串作为字符串

我正在尝试找到具有最大长度的 java 给定属性的字符串。我会将属性名称作为字符串传递给方法,该方法将返回最大长度的字符串值。

   class Employee {
        private String name;
        private String designation;
        private List<Address> address;
        private ContactInfo contactInfo;
        ....
        getter setter
    }
    
    class Address {
        private String city;
        private String state;
        private String country;
        ......
        getter setter
    }
    
    class ContactInfo {
        private String mobileNumber;
        private String landlineNumber;
        ....
        getter setter
    }
Run Code Online (Sandbox Code Playgroud)

我有一些数据如下:

ContactInfo contactInfo = new ContactInfo("84883838", "12882882");
Address address1 = new Address("city111", "state111", "country111");
Address address2 = new Address("city111111", "state11112", "country1112");

Employee employee1 = new Employee("xyz", "uyyy", List.of(address1, address2), …
Run Code Online (Sandbox Code Playgroud)

java java-8

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