首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java 8显示了此错误,在封闭范围内定义的局部变量itemList必须是最终的或有效的final?

Java 8显示了此错误,在封闭范围内定义的局部变量itemList必须是最终的或有效的final?
EN

Stack Overflow用户
提问于 2018-10-12 00:23:55
回答 2查看 0关注 0票数 0

我正在使用java 8编写代码,但我迭代a List然后RestaurantOrderBook使用类别类型查找。把它List放进去Map,显示了这个错误:

在封闭范围内定义的局部变量itemList必须是最终的或有效的final

代码语言:javascript
复制
Query query = new Query();
String categ = category;
query.addCriteria(Criteria.where("restaurantId").is(restaurantId));

List<RestaurantOrderBook> itemList = new ArrayList<RestaurantOrderBook>();
itemList = mongoTemplate.find(query, RestaurantOrderBook.class);
System.out.println("size : " + itemList.size());
Map<String , List<RestaurantOrderBook>> map = new HashMap<String , List<RestaurantOrderBook>>();
        Arrays.asList("TakeAway", "Dining").forEach(e ->{

//Following line throws error:              
List<RestaurantOrderBook> list  = itemList.stream().filter(a -> !a.getOrderType().isEmpty() && a.getOrderType().equals(e)).collect(Collectors.toList());
                map.put(e, list);
        });

我有另一种情况:

代码语言:javascript
复制
@Override
    public EventReportRewardsPoints eventReportRewardsPoints(String organizerId) {
        try{
            List<Event> listOfEvents = eventRepo.findByOrganizerId(organizerId);
            EventReportRewardsPoints eventTransReport = new EventReportRewardsPoints();
            Integer soldTics = 0;
            Double totalRevenue = 0d;
            Integer soldToday  = 0;

            Integer findTotalAvailableTics = 0;
            Integer findTotalQtytics = 0;

            for (Event event : listOfEvents) {
                List<EventTicket> eventTicket = eventTicketRepo.findByEventId(event.getId());

                Integer sumOfAvailabletics = eventTicket.stream()
                        .mapToInt(EventTicket::getRemainingTickets).sum();
                findTotalAvailableTics = findTotalAvailableTics + sumOfAvailabletics;

                Integer sumOfQtytics = eventTicket.stream().mapToInt(EventTicket::getQty).sum();
                findTotalQtytics  = findTotalQtytics + sumOfQtytics;

                List<EventTicketBook> listOfEventsTic = eventTicketBookRepository.findByEventId(event.getId());
                for (EventTicketBook eventTicketBook : listOfEventsTic) {
                    Double sumOfSales = eventTicketBook.getTickets().stream().mapToDouble(EventTicket::getPrice).sum();
                    totalRevenue = totalRevenue + sumOfSales;
                    Date now = new Date();
                    System.out.println("create date : " + eventTicketBook.getCreateOn());
                    /*if(now.compareTo(eventTicketBook.getCreateOn()) == 0){
                        Integer sumOfSoldToday = eventTicketBook.getTickets().stream().mapToInt(EventTicket::getQty).sum();
                        soldToday = soldToday + sumOfSoldToday;
                    }*/
                }
            }
            System.out.println("findTotalQtytics : " + findTotalQtytics);
            System.out.println("findTotalAvailableTics : " + findTotalAvailableTics);
            soldTics = findTotalQtytics - findTotalAvailableTics;
            eventTransReport.setTotalRevenue(totalRevenue);
            eventTransReport.setSoldToday(soldToday);
            eventTransReport.setTicketsSold(soldTics);
            return eventTransReport;
        }catch(Exception e ){
            e.printStackTrace();
        }
        return null;
    }

我如何使用lamda表达式实现此目的。

EN

回答 2

Stack Overflow用户

发布于 2018-10-12 08:28:44

正在lambda表达式中使用itemList。因此它必须是最终的。

Java 8引入了有效final的新概念,这意味着,编译器会检查所使用的变量是否为最终使用,并且不会强制开发人员明确声明它为final。

因此,如果将代码更改为

代码语言:javascript
复制
final List<RestaurantOrderBook> itemList = new ArrayList<RestaurantOrderBook>();

你会看到编译器给你一个错误:

代码语言:javascript
复制
itemList = mongoTemplate.find(query, RestaurantOrderBook.class);

因为你正在重新分配itemList。这就是为什么itemList也没有有效的最终结果。如果你压扁这两行

代码语言:javascript
复制
List<RestaurantOrderBook> itemList = mongoTemplate.find(query, RestaurantOrderBook.class);
票数 0
EN

Stack Overflow用户

发布于 2018-10-12 09:57:25

声明变量项目列表最后一项:

代码语言:txt
复制
final List<RestaurantOrderBook> itemList = mongoTemplate.find(query, RestaurantOrderBook.class);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100002892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档