我正在使用java 8编写代码,但我迭代a List
然后RestaurantOrderBook
使用类别类型查找。把它List
放进去Map,
显示了这个错误:
在封闭范围内定义的局部变量itemList必须是最终的或有效的final
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);
});
我有另一种情况:
@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表达式实现此目的。
发布于 2018-10-12 08:28:44
正在lambda表达式中使用itemList。因此它必须是最终的。
Java 8引入了有效final的新概念,这意味着,编译器会检查所使用的变量是否为最终使用,并且不会强制开发人员明确声明它为final。
因此,如果将代码更改为
final List<RestaurantOrderBook> itemList = new ArrayList<RestaurantOrderBook>();
你会看到编译器给你一个错误:
itemList = mongoTemplate.find(query, RestaurantOrderBook.class);
因为你正在重新分配itemList。这就是为什么itemList也没有有效的最终结果。如果你压扁这两行
List<RestaurantOrderBook> itemList = mongoTemplate.find(query, RestaurantOrderBook.class);
发布于 2018-10-12 09:57:25
声明变量项目列表最后一项:
final List<RestaurantOrderBook> itemList = mongoTemplate.find(query, RestaurantOrderBook.class);
https://stackoverflow.com/questions/-100002892
复制相似问题