作者JustinHere (良葛格)
看板java
标题Re: [问题] Lambda语法
时间Wed Oct 14 09:16:21 2015
方向不太对,仔细看原本的 for 回圈,其实主要是在 filter 出想要的 Order
,才从後续留下的 Order 取得细节,因此,比较好的写法是:
orders.stream()
.filter(order -> order.getOrdertails().getAmount() > 5 && order.getOrderDetail().getProduct() != null)
.forEach(order -> {
OrderDetail orderDetail = order.getOrdertails()
String s = String.format("%s Buy %s * %d",
order.getId(),
orderDetail.getProduct().getName(),
orderDetail.getAmount());
System.out.println(s);
});
关键在於,原本的 for 回圈用了两个 if,其实就是 && 两个情况的意思 …
当然,如果想要更读性更好一些,可以将 filter 与 forEach 中的逻辑提取至方法,
然後用方法参考:
orders.stream()
.filter(OrderUtil::amountGTFiveAndHasProduct)
.forEach(OrderUtil::printIdNameAmount);
public class OrderUtil {
public static boolean amountGTFiveAndHasProduct(Order order) {
return order.getOrdertails().getAmount() > 5 &&
order.getOrderDetail().getProduct() != null;
}
public static void printIdNameAmount(Order order) {
OrderDetail orderDetail = order.getOrdertails()
String s = String.format("%s Buy %s * %d",
order.getId(),
orderDetail.getProduct().getName(),
orderDetail.getAmount());
System.out.println(s);
}
}
※ 引述《kojilin (阿~~小达达)》之铭言:
: ※ 引述《Argosde ()》之铭言:
: : 最近在学Java8 Lambda语法
: : 自己在练习两层for回圈的重构
: : 遇到一个状况,不知道是我使用观念错误还是有不知道的方法
: : 两层For回圈版本
: : for(Order order : orders){
: : for(OrderDetail orderDetail : order.getOrdertails()){
: : if(orderDetail.getAmount()>5){
: : Product product = orderDetail.getProduct();
: : if(product!=null){
: : String s = String.format("%s Buy %s * %d", order.getId(), product.getName(), orderDetail.getAmount());
: : System.out.println(s);
: : }
: : }
: : }
: : }
: : Lambda版本
: : orders.stream()
: : .flatMap(order -> order.getOrdertails().stream())
: : .filter(orderDetail -> ordertail.getAmount()>5)
: : .map(orderDetail1 -> orderDetail1.getProduct())
: : .forEach(product -> {
: : ?
: : });
: : 在?的地方没办法呼叫到上层资料,不知道是不是Lambda不适用这种状况还是有其他方法
: : 第一次发问,请多指教...
: 这种情况下我就不一定会用 stream, 但你真要做可以像这样,建一个容器
: class Pair<T1, T2>
: 然後
: orders.stream()
: .flatMap(order -> order.getOrdertails().stream()
: .map(detail -> new Pair<>(order, detail)))
: .filter(orderDetail -> orderDetail.getT2().getAmount() > 5)
: .map(orderDetail -> new Pair<>(orderDetail, orderDetail.getT2().getProduct()))
: .forEach(product -> {
: });
: 另一种就是丑一点,巢状 stream,但程式码就更难读@@...
: orders.stream()
: .forEach(order -> order.getOrdertails()
: .stream()
: .filter(orderDetail -> orderDetail.getAmount() > 5)
: .forEach(orderDetail -> {
: }));
: koji
--
良葛格学习笔记
http://openhome.cc
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 101.12.85.15
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/java/M.1444785384.A.1BD.html
※ 编辑: JustinHere (101.12.85.15), 10/14/2015 09:21:21
※ 编辑: JustinHere (101.12.85.15), 10/14/2015 09:23:31
※ 编辑: JustinHere (101.12.85.15), 10/14/2015 09:24:22
※ 编辑: JustinHere (101.12.85.15), 10/14/2015 10:57:54
1F:推 james732: 推良葛格 10/14 11:06
2F:→ swpoker: 其实都lambda 当然函式也要匿名阿 10/14 15:20
3F:推 Argosde: order 1-n* orderDetail 1-1* product 10/15 22:36
4F:→ Argosde: filter会变成 getOrderdetails().stream().anyMatch(...) 10/15 22:39
5F:→ Argosde: 这样filter会筛选到orderDetails吗? 10/15 22:41