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

我正在使用java 8编写代码,但我迭代一个List ,然后使用类别类型查找RestaurantOrderBook 。 并将该List放入Map 。 它显示了这个错误:

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

 Query query = new Query(); String categ = category; query.addCriteria(Criteria.where("restaurantId").is(restaurantId)); List itemList = new ArrayList(); itemList = mongoTemplate.find(query, RestaurantOrderBook.class); System.out.println("size : " + itemList.size()); Map<String , List> map = new HashMap<String , List>(); Arrays.asList("TakeAway", "Dining").forEach(e ->{ //Following line throws error: List list = itemList.stream().filter(a -> !a.getOrderType().isEmpty() && a.getOrderType().equals(e)).collect(Collectors.toList()); map.put(e, list); }); 

我有另一种情况:

 @Override public EventReportRewardsPoints eventReportRewardsPoints(String organizerId) { try{ List 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 = 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 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表达式实现此目的。

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

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

因此,如果您将代码更改为

 final List itemList = new ArrayList(); 

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

 itemList = mongoTemplate.find(query, RestaurantOrderBook.class); 

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

 List itemList = mongoTemplate.find(query, RestaurantOrderBook.class); 

它应该工作。

声明你的变量itemList final:

 final List itemList = mongoTemplate.find(query, RestaurantOrderBook.class);