首页 > 解决方案 > Java 8 Stream - 令牌“(”上的语法错误,此令牌后应有表达式

问题描述

我没有使用过任何 Java 8。

这是我在 Java 8 版本下面编写的代码。

List<GetOrderResponseType> orders = findOrderResponseType.getOrder();       
List<GetOrderResponseType> openOrders = new ArrayList<GetOrderResponseType>();

if (!CollectionUtils.isEmpty(orders)) { 
            for(GetOrderResponseType order : orders ) {     
                if ( order != null) {
                    if (order.getOrderSummary() != null) {
                        if ( order.getOrderSummary().getState() != null) {

                            if (order.getOrderSummary().getState().toString().toLowerCase().startsWith("open")) {
                                openOrders.add(order);
                            } 
                        }
                    }
                }
            }
        }       
        return openOrders;  

Now, I am trying to change to Java 8 using Streams.

openOrders = orders.stream()
                        .filter(order -> Objects.nonNull(order))
                        .map(order -> order.getOrderSummary())
                        .filter(orderSummary -> Objects.nonNull(orderSummary))
                        .map(orderSummary -> orderSummary.getState())
                        .filter(orderSummaryState -> Objects.nonNull(orderSummaryState))
                        .map(orderSummaryState -> orderSummaryState.toString())
                        .filter(orderSummaryStateStr -> Objects.nonNull(orderSummaryStateStr))
                        .filter(orderSummaryStateStr -> orderSummaryStateStr.toLowerCase().startsWith("open"))
                        .collect(Collectors.toList<GetOrderResponseType>());

在最后一条语句中,我在令牌“(”上出现语法错误,此令牌之后的表达式。

谢谢,班迪塔普拉丹

标签: java

解决方案


.map()函数更改存储在流中的对象的类型。例如,当你这样做时,.map(order -> order.getOrderSummary())你正在将流从 更改Stream<GetOrderResponseType>Stream<OrderSummary>。因此,在您尝试将流收集回 a 的最后一步时List<GetOrderResponseType>,您不能因为您有 a Stream<String>,这是字符串顺序摘要状态,而不是Stream<GetOrderResponseType>.

您尝试完成的工作可能最好使用单个过滤器完成,并传入一个进行过滤的方法引用,如下所示:

List<GetOrderResponseType> openOrders = orders.stream()
    .filter(this::isOpenOrder)
    .collect(Collectors.toList());

然后像这样定义一个isOpenOrder方法:

private boolean isOpenOrder(GetOrderResponseType order) {
    if (order == null) {
        return false;
    }
    if (order.getOrderSummary() == null) {
        return false;
    }
    if (order.getOrderSummary().getState() == null) {
        return false;
    }
    return order.getOrderSummary().getState().toString().toLowerCase().startsWith("open");
}

推荐阅读