Re: [问题] Lambda语法

楼主: JustinHere (良葛格)   2015-10-14 09:16:21
方向不太对,仔细看原本的 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
作者: james732 (好人超)   2015-10-14 11:06:00
推良葛格
作者: swpoker (swpoker)   2015-10-14 15:20:00
其实都lambda 当然函式也要匿名阿
作者: Argosde   2015-10-15 22:36:00
order 1-n* orderDetail 1-1* productfilter会变成 getOrderdetails().stream().anyMatch(...)这样filter会筛选到orderDetails吗?

Links booklink

Contact Us: admin [ a t ] ucptt.com