小编AMa*_*gic的帖子

错误:Java:无效的目标版本:11-IntelliJ IDEA

我正在尝试构建使用Java 8构建的应用程序,现在已升级到Java11。我在Windows计算机中使用oracle文章安装了Java 11,并使用IntelliJ IDEA 2017作为IDE。

我更改了系统环境变量并设置了

JAVA_HOME to C:\Program Files\Java\jdk-11.0.1
Run Code Online (Sandbox Code Playgroud)

并将其添加到Path变量中。

C:\>java -version
java version "11.0.1" 2018-10-16 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.1+13-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.1+13-LTS, mixed mode) 
Run Code Online (Sandbox Code Playgroud)

当我在IntelliJ中构建应用程序时,这是我得到的:

Information:java: Errors occurred while compiling module 'test-domain_main'
Information: javac 1.8.0_171 was used to compile java sources
Information:1/10/2019 4:21 PM - Compilation completed with 1 error and 0 warnings in 1s 199ms
Error:java: invalid target …
Run Code Online (Sandbox Code Playgroud)

java intellij-idea java-11

21
推荐指数
12
解决办法
3万
查看次数

Comparator.comparing(...).thenComparing(...) 找出哪些字段不匹配

我正在尝试比较同一类的两个对象,目标是比较它们并确定哪些字段不匹配。

我的域类示例

@Builder(toBuilder=true)
class Employee {
     String name;
     int age;
     boolean fullTimeEmployee;
}
Run Code Online (Sandbox Code Playgroud)

两个对象

Employee emp1 = Employee.builder().name("john").age(25).fullTime(false).build();
Employee emp2 = Employee.builder().name("Doe").age(25).fullTime(true).build();
Run Code Online (Sandbox Code Playgroud)

比较两个对象

int result = Comparator.comparing(Employee::getName, Comparator.nullsFirst(Comparator.naturalOrder()))
                       .thenComparing(Employee::getAge, Comparator.nullsFirst(Comparator.naturalOrder()))
                       .thenComparing(Employee::isFullTimeEmployee, Comparator.nullsFirst(Comparator.naturalOrder()))
                       .compare(emp1, emp2);
Run Code Online (Sandbox Code Playgroud)

结果将是0因为name&fullTime字段彼此不匹配。

但我也想生成一个不匹配的字段列表......如下所示

List<String> unmatchedFields = ["name","fulltimeEmployee"];
Run Code Online (Sandbox Code Playgroud)

我可以用更好的方式来做,而不是一堆 if() else

java comparator java-8

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

Java 8 - 使用startsWith从列表中过滤字符串-X并将String-X保存到列表中

我是Java 8的新手,并试图了解流和过滤器如何与列表一起工作.我有一个预定义的字符串列表,我有一个我正在处理的字符串值.如果字符串以预定义列表中的任何字符串开头,我想将处理后的字符串添加到新列表中.如果字符串与列表中的任何字符串都不匹配,则将其保存到另一个列表中.

例如:

List<String> internalIpAddresses= new ArrayList<>();
List<String> externalIpAddresses = new ArrayList<>();

List<String> ipAddresseses = new ArrayList<String>();
ipAddresses.add("10.");
ipAddresses.add("132.174.");
ipAddresses.add("192.168.");

// filter internal ip addresses
for(String ipAddress : ipAddresseses){

     if("10.11.12.13".startsWith(ipAddress)) {
          internalIpAddresses.add("10.11.12.13");
     }
}

// filter external ip addresses
for(String ipAddress : ipAddresseses){

     if(!"5.6.7.8".startsWith(ipAddress)) {
          externalIpAddresses .add("5.6.7.8");
     }
}
Run Code Online (Sandbox Code Playgroud)

结果:

internalIpAddresses: 10.11.12.13
externalIpAddresses : 5.6.7.8 
Run Code Online (Sandbox Code Playgroud)

有没有办法在java 8中使用stream以更简单的方式实现?

喜欢:

ipAddresseses.stream()
     .filter(ipAddress -> clientIpAddress.startsWith(ipAddress)
     .*if the clientIpAddress starts with any of the values in the list then add to internalIpAddresses List
     .*if …
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

7
推荐指数
3
解决办法
1464
查看次数

计算列表中字符串的出现次数,然后对结果进行排序 - Java 8

我看到这种“计数出现次数和排序”类型的问题有很多风格(最接近的相关问题是this),但它们都不适用于我的情况。

这是我的代码。

List<Employee> employees = new ArrayList<>();

Employee e1 = new Employee;
e1.setFirstName("Beth");

Employee e2 = new Employee;
e1.setFirstName("Beth");

Employee e3 = new Employee;
e1.setFirstName("Andrew");

// similarly I'm creating millions of employees and adding them to my list below 

employees.add(e1);
employees.add(e2);
employees.add(e3);
employees.add(e53456667);

//count occurrences of first names
Map<String, Long> employeeFirstNameCount = employees.stream()
                .collect(Collectors.groupingBy(p -> p.getFirstName(), Collectors.counting()));
Run Code Online (Sandbox Code Playgroud)

这导致

{Beth=2, Andrew=34674, Charles=2388491, John=223545, Alex=2345562}
Run Code Online (Sandbox Code Playgroud)

但我需要它作为

{Alex=2345562, Andrew=34674, Beth=2, Charles=2388491, John=223545}
Run Code Online (Sandbox Code Playgroud)

我尝试过这个(参考):

Map<String, Long> employeeFirstNameCount = employees.stream()
        .collect(Collectors.groupingBy(p …
Run Code Online (Sandbox Code Playgroud)

java sorting java-8 java-stream collectors

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

@JsonInclude(Include.NON_EMPTY) 在使用 CUSTOM SERIALIZER 时不起作用

似乎当我使用自定义序列化程序时,它@JsonInclude(Include.NON_NULL)会被完全忽略。

我的要求是不要序列化值为空的键。我还想通过为多值添加空格分隔符来格式化字符串SortedSet(这就是我创建自定义序列化程序的原因)

没有任何空值的电流输出示例

{
  "age": "10",
  "fullName": "John Doe"
  "email":"doe@john.com john@doe.com test@gmail.com"
}
Run Code Online (Sandbox Code Playgroud)

具有空值的电流输出示例

{
  "age": "10",
  "fullName": "John Doe"
  "email":null
}
Run Code Online (Sandbox Code Playgroud)

电子邮件为空时的预期输出:

{
  "age": "10",
  "fullName": "John Doe"
}
Run Code Online (Sandbox Code Playgroud)

DTO

@AllArgsConstructor
@Builder
@Data
@NoArgsConstructor
@ToString
@SuppressWarnings("PMD.TooManyFields")
public class User {
    @JsonProperty("age")
    private String age;

    @JsonProperty("firstName")
    private String name;

    @JsonProperty("email")
    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    @JsonSerialize(using = MultiValuedCollectionSerializer.class)
    private SortedSet<String> email;
}
Run Code Online (Sandbox Code Playgroud)

自定义序列化程序

public class MultiValuedCollectionSerializer extends JsonSerializer<Collection> {

    @Override
    public void serialize(final Collection inputCollection, 
                          final JsonGenerator jsonGenerator, 
                          final SerializerProvider …
Run Code Online (Sandbox Code Playgroud)

java json jsonserializer java-11

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