我正在尝试构建使用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) 我正在尝试比较同一类的两个对象,目标是比较它们并确定哪些字段不匹配。
我的域类示例
@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 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) 我看到这种“计数出现次数和排序”类型的问题有很多风格(最接近的相关问题是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) 似乎当我使用自定义序列化程序时,它@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)