标签: java-8

对相同字段但不同条件的 Java Stream 过滤

我有一个 Person 类:

@Data
public class Person {
   private Integer id;
   private String status;
}
Run Code Online (Sandbox Code Playgroud)

我有一个名为 personList 的人员列表:

[{ 
    "id": null,
    "status": "inactive"
 },
 { 
    "id": 2,
    "status": "inactive"
 },
 { 
    "id": null,
    "status": "active"
 }]
Run Code Online (Sandbox Code Playgroud)

现在我需要找到所有状态为“非活动”的人,无论该人是否有 Id。如果某人没有 Id,但状态为“活跃”,则也包括该人。我正在使用 Java 流进行过滤:

 List<Person> inactivePersonList = 
     personList.stream()
               .filter(person -> person.getStatus().equals("inactive"))
               .filter(person -> person.getId() == null && person.getStatus().equals("active"))
               .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

直播后的结果是没人接听。第一个人没有被选中,因为它没有通过第二个过滤器,最后一个人没有被选中,因为它没有通过第一个过滤器。

我想我可以通过使用 将两个过滤器合二为一来修复它OR,但我试图使每个过滤器变得简单,所以在我进行更改之前,我想问一下是否有更好的方法来做到这一点。谢谢。

java java-8 java-stream

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

大量问题

我正在尝试用阶乘计算尾随零的数量。

例如

4!= 24 所以你检索到 0。

9!= 362880 所以你检索 1。

10!= 9!x 10 = 3628800 所以你检索 2。

11!= 10!x 11 = 3.99168E7 所以你检索 2。

    static double factorial(double n) {
        double f = 1;
        for(int i = 1 ; i <= n ; i++) {
            f *= i;
        }
        return f;
    }

    static int numberOfZeros(double f) {
        int ten = 1;
        int count = 0;
        for(;f%Math.pow(10, ten) == 0;count++) {

            ten++;
        }
        return count;
    }
Run Code Online (Sandbox Code Playgroud)

这个代码是好的,直到数字 n 是 22。但是当我尝试将 23 放入然后计数是 …

java math largenumber factorial java-8

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

在 Java 8 中使用 Optional 进行多次空检查

我想使用 Java 8 使用多个ifelse语句来简化下面的代码。有没有办法使用一些 Java 8 功能来完全摆脱它们,例如Optional?我试图在这里找到一些东西,但找不到答案。

LocalDateTime beDate = someDate;
LocalDateTime aeDate = someDate;
LocalDateTime eDate;

if (beDate == null && aeDate == null) {
    eDate = null;
}
else if (beDate != null && aeDate == null) {
    eDate = beDate;
}
else if (beDate == null && aeDate != null) {
    eDate =  aeDate;
}
else if (beDate != null && aeDate != null && 
        (beDate.isEqual(aeDate) || beDate.isBefore(aeDate))) {
    eDate = …
Run Code Online (Sandbox Code Playgroud)

java datetime if-statement optional java-8

2
推荐指数
2
解决办法
275
查看次数

在 Java 中,新建或增强类加载器的用例是什么?

在 Java 中,我们知道类加载器是一个 JVM 系统,它将类加载到 JVM 中执行。当我运行一个简单的 Java 类时,它会被运行时系统加载和执行。在这里,我没有对类加载做任何事情。但是我可以看到,有很多项目在编写自定义类加载器或增强现有的类加载器。请让我知道需要类加载器增强或新类加载器的生产时间用例。

java jvm classloader dynamic-class-loaders java-8

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

无法将字符串解析为 Java 8 LocalDateTime

运行它会给我以下错误,我错过了什么?

public static void main(String[] args) {

    DateTimeFormatter _timestampFomatGMT = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");
    LocalDateTime localDateTime = LocalDateTime.parse("20200331094118137",_timestampFomatGMT);
    System.out.println(localDateTime);     
}
Run Code Online (Sandbox Code Playgroud)

给了我以下例外。我错过了什么?

Exception in thread "main" java.time.format.DateTimeParseException: Text '20200331094118137' could not be parsed at index 0
        at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)
        at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
        at java.time.LocalDateTime.parse(LocalDateTime.java:492)
        at cotown.lib.common.util.JavaTimeUtil.main(JavaTimeUtil.java:90)
Run Code Online (Sandbox Code Playgroud)

java datetime java-8

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

编写 checkOrElseThrow 通用函数的更好方法

我有两个函数调用 Employee 和 Address DAO 类,我在其中检查员工姓名或地址是否已被使用

为了使检查和抛出异常通用,我创建了以下通用函数

checkOrElseThrowCommonUtil.java

public static <R, C, T extends Throwable> R checkOrElseThrow(R rtn, C chk, Supplier<? extends T> ex) throws T
{
    if (chk != null)
    {
        throw ex.get();
    }
    return rtn;
}
Run Code Online (Sandbox Code Playgroud)

上面的通用函数在EmployeeDAO.javaAddressDAO.java 中被调用,如下所示

checkAndReturnEmployeeEmployeeDAO.java

public Employee checkAndReturnEmployee(Employee employee) {
    return checkOrElseThrow(
        employee,
        employee.getAddressName(),
        () -> new EntityNotFoundException("Employee already in use for another address"));
}
Run Code Online (Sandbox Code Playgroud)

checkAndReturnAddressAddressDAO.java

public Address checkAndReturnAddress(Address address) {
    return checkOrElseThrow(
        address, …
Run Code Online (Sandbox Code Playgroud)

java lambda throwable java-8 supplier

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

如何将以下比较器转换为 Comparator.comparing?

我的问题可能不清楚,所以让我举例说明一下:

Arrays.sort(arr, new Comparator<String>(){
    public int compare(String a, String b){
        return (b + a).compareTo(a + b);
    }
});
Run Code Online (Sandbox Code Playgroud)

我想使用 Comparator.comparing。我尝试了以下方法:

Arrays.sort(arr, Comparator.comparing((a, b) -> (b + a).compareTo((String)a + b)));
Run Code Online (Sandbox Code Playgroud)

我收到一个错误 - lamdba 表达式中的返回类型错误。如何解决这个问题?

java arrays comparator java-8

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

在 EST 与 UTC 中运行的服务器中的 LocalDate 和 LocalDateTime

我正在尝试了解 LocalDate 和 LocalDateTime。由于它们不携带时区信息,它如何在两个不同时区的 now() 中工作。

例子:

服务器 1(EST 时区):

LocalDateTime.now() -> 2020-04-06T23:00:00.040 LocalDate.now()。-> 2020-04-06

服务器 2(UTC 时区):

LocalDateTime.now() -> 值是多少?本地日期.now()。-> 价值是多少?(美国东部时间注意,执行时间是晚上 11 点)

另外,如果我将下面的日期字符串转换为 LocalDateTime 然后再转换为 LocalDate,结果会是什么?

2020-04-06T23:00:00.000

java timezone utc java-8 localdate

2
推荐指数
2
解决办法
3190
查看次数

通过将值与数组中的现有键相加来构造 HashMap 而不覆盖键

我正在尝试从数组下方构造一个 HashMap

product: [
 {
  id: 12345
  qty: 5
 },
 {
  id: 12345
  qty: 6
 },
 {
  id: 98765
  qty: 10
 }
]
Run Code Online (Sandbox Code Playgroud)

代码:

HashMap<Long, Integer> productMap = new HashMap<>();
int totalQty = 0;

for (Product product : products) {
 Long id = product.getId();
 if (productMap.containsKey(id)) {
  productMap.put(id, totalQty + productMap.get(id).intValue());
 } else {
  productMap.put(id, totalQty);
 }
}
Run Code Online (Sandbox Code Playgroud)

从上面的方法中,我正在检查地图中的键,如果是,则通过覆盖现有键将 qty 添加到 totalQty 中,任何在对值求和时不覆盖的最佳方法?

java spring java-8 spring-boot

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

有没有办法用 Java 中已经包含的值来初始化 SortedMap&lt;Integer, String&gt; ?

我想做这样的事情

SortedMap<Integer, String> stuff = new TreeMap<Integer, String>({1:"a",2:"b"});
Run Code Online (Sandbox Code Playgroud)

很像您在 python 中所做的那样,但在 Java 中是可能的,还是调用 .put() 两次的唯一方法?

java initialization sortedmap data-structures java-8

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