我正在尝试将给定产品的所有价格添加为:
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,防止任何类型的异常?
鉴于:
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 次?
我试图通过下一个代码将我的流转换为映射:
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()。
我必须List<Card>在字段issueDate(类型String)上进行过滤,其中卡片要显示到过去 7 年的日期。
我尝试过的解决方案是issueDate从Stringto解析字段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)
甚至不能申请循环,因为可能有数百张卡发行,它通过迭代每个发卡日期(字符串到日期和检查年份)来影响性能
任何人都可以提出一个很好的解决方案来解决这个问题吗?
Stream#empty返回一个空的序列Stream。从本教程中,我了解到空流可能有助于在调用带有流参数的方法时避免空指针异常。但是,我想不出一个例子可以帮助我清楚地理解这个陈述。
我有一个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 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 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 中像这样获得一年的第一天?
这是我的代码:
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-8 ×10
java ×9
java-stream ×6
collections ×2
arraylist ×1
hashmap ×1
java-11 ×1
java-time ×1
jvm ×1
lambda ×1