标签: java-8

防止在 java 8 的 map() reduce() 中为 BigDecimal 添加空指针

我正在尝试将给定产品的所有价格添加为:

 BigDecimal getTotalPrice(List<Product> products) {
        return products.stream()
                .map(Product::getPrice)
                .peek(bigDecimal -> System.out.println(bigDecimal))
                .reduce(BigDecimal.ZERO, BigDecimal::add);
    }
Run Code Online (Sandbox Code Playgroud)

我试着打印所有的值bigDecimal,每当我们得到的价值null,我们正在java.lang.NullPointerException,有没有另外的什么更好的办法java 8,防止任何类型的异常?

java collections java-8 java-stream

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

Java 8:Stream.filter 未按预期运行

鉴于:

    List<String> str = Arrays.asList ("my", "pen", "is", "your", "pen");
    Predicate<String> test = s -> {
        int i = 0;
        boolean result = s.contains ("pen");
        System.out.print((i++) + ":");
        return result;
    };
Run Code Online (Sandbox Code Playgroud)

这打印: 0:0:

    str.stream().filter(test).findFirst();
Run Code Online (Sandbox Code Playgroud)

这将打印 0:0:0:0:0:

    str.stream().filter(test).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

令我困惑的是,无论是findFirst还是collect,无论终端操作是否短路,它们都应该遍历列表中的每个项目,对吗?

那么为什么在第一个示例 findFirst 中,“0:”被打印两次,而不是一次,而不是5 次

java short-circuiting java-8 java-stream

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

Java BinaryOperator 和工厂方法。如何返回第一个参数?

我试图通过下一个代码将我的流转换为映射:

Collectors.toMap(City::key, Function.identity(), (first, second) -> first)
Run Code Online (Sandbox Code Playgroud)

我关于最后一个 lambda 的问题。

(first, second) -> first
Run Code Online (Sandbox Code Playgroud)

如果发生碰撞,我经常需要获取任何元素或始终获取第一个元素。我明白,这已经是简短而清晰的形式。但是还是。对于Function类,我们有工厂方法Function.identity(),它按原样返回传递的参数。我们有 forBiFunction或 for的工厂方法BinaryOperator吗?或者可能是接近Function.identity(). 我也知道BinaryOperator.minBy()BinaryOperator.maxBy(),但他们更“详细”,而不是比如此清晰的方法Function.identity()

java collections lambda java-8 java-stream

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

Java8 过滤器数组列表与字段日期上的自定义对象

我必须List<Card>在字段issueDate(类型String)上进行过滤,其中卡片要显示到过去 7 年的日期。

我尝试过的解决方案是issueDateStringto解析字段Date,然后应用date.after(startDate)date.before(endDate)如下所示:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
cardList.stream()
        .map(s->s.getIssueDate())
        .filter(dt -> sdf.parse(dt).after(sdf.parse("2020-06-08")) && 
                      sdf.parse(dt).before(sdf.parse("2020-08-12")))
        .collect(Collectors.toList());  
Run Code Online (Sandbox Code Playgroud)

甚至不能申请循环,因为可能有数百张卡发行,它通过迭代每个发卡日期(字符串到日期和检查年份)来影响性能

任何人都可以提出一个很好的解决方案来解决这个问题吗?

arraylist simpledateformat java-8 java-stream java-time

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

Stream.empty 的实际用途是什么?

Stream#empty返回一个空的序列Stream。从本教程中,我了解到空流可能有助于在调用带有流参数的方法时避免空指针异常。但是,我想不出一个例子可以帮助我清楚地理解这个陈述。

java java-8 java-stream

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

检查地图的所有值是否为真

我有一个Map<String, Boolean> map = new HashMap<>();
考虑其中有五个键。

map.put("A", true);
map.put("B", true);
map.put("C", false);
map.put("D", true);
map.put("E", true);
Run Code Online (Sandbox Code Playgroud)

如果上面地图中的所有值都为真,我需要将一个布尔标志设置为真。
如果任何值是假那么我需要将布尔标志设置为假

我可以迭代这张地图并像旧的方式一样做,但我想知道如何通过在这张地图上流式传输在一行中做到这一点。

java hashmap java-8 java-stream

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

接口的默认方法存储在内存中的什么地方?

我浏览了许多帖子,但似乎都回答了接口的静态方法存储在哪里。但是,接口可以具有抽象、静态和默认方法。我知道静态和抽象方法。但是,我无法在内存中找到与默认方法存储相关的任何内容。

我可能错了,但我认为默认方法将存储在静态堆空间中,就像实例方法与类一起存储一样。但是,除此之外,考虑到实现类不会覆盖接口中默认方法的实现并且没有菱形问题,如果默认方法也被分配给堆栈帧,我也很困惑。

我参考了以下链接:

方法存储在内存中的什么位置?

Java中的静态方法和静态变量存储在哪里?

java jvm memory-management java-8 default-method

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

我们如何有效地编码空检查 Java 8

新到Java 8风格;

我们可以通过在 Java 8 API 中包含所有空检查来为以下语句编写代码有多有效

search.getResource()
                        .getResults().get(0).getCustomer().getPhoneNumber()
Run Code Online (Sandbox Code Playgroud)

我试过如下:(我觉得到处都是 Optional 有点奇怪)

List<Result> results = search.getResource().getResults();

                Optional<Result> optionalResult =  Optional.of(results).orElse(new ArrayList<>()).stream().findFirst();
                if(optionalResult.isPresent() && Optional.of(optionalResult.get().getCustomer()).isPresent()) {
                    Source source = Optional.of(optionalResult.get().getCustomer()).get();
                    Optional<List<Customer>> customers = Optional.of(source.getCustomers());
                    if(customers.isPresent() && customers.get().stream().findFirst().isPresent() &&
                            Optional.of(customers.get().stream().findFirst().get().getPhoneNumber()).isPresent())
                        dest.setNumber(Integer.parseInt(customers.get().stream().findFirst().get().getPhoneNumber())));
                }
Run Code Online (Sandbox Code Playgroud)

你能不能给我建议一个更好的方法。谢谢!

java java-8

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

java 8 新日期/时间 API 获取一年中的第一天

使用 java 7 我们可以得到一年的第一天

    Calendar currentCal = Calendar.getInstance();
    currentCal.set(Calendar.DAY_OF_YEAR, 1);
    currentCal.set(Calendar.MONTH, 0);
    currentCal.set(Calendar.DAY_OF_MONTH, 1);
    currentCal.set(Calendar.HOUR_OF_DAY, 0);
    currentCal.set(Calendar.MINUTE, 0);
    currentCal.set(Calendar.SECOND, 0);
    currentCal.set(Calendar.MILLISECOND, 0);
    //currentCal.getTime();
Run Code Online (Sandbox Code Playgroud)

如何在 java 8 new Date/Time API 中像这样获得一年的第一天?

java java-8

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

如何在 Java 中使用 lambda 打印字符串数组列表

这是我的代码:

List<String[]> salaries = getSalariesByMonth();

//I am using the old way to print the data
for (String[] obj : rates) {
    System.out.println("User name: "obj[0]+"--"+"Salary: "+obj[1]);   //obj[0] is NAME,  obj[1] is SALARY
}

//I am trying to use this way to print the data but unable to do so.
salaries.forEach(s-> System.out.println("print NAME and SALARY"));
Run Code Online (Sandbox Code Playgroud)

如何使用 Lambda 打印包含字符串数组的列表。先感谢您。

java java-8 java-11

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