gpt4 book ai didi

Java 8 显示此错误。在封闭作用域中定义的局部变量 itemList 必须是 final 或有效 final

转载 作者:行者123 更新时间:2023-12-05 01:04:32 26 4
gpt4 key购买 nike

我正在使用 java 8 编写代码,但我迭代了一个 List然后找到RestaurantOrderBook使用类别类型。然后把那个 ListMap .它显示此错误:

Local variable itemList defined in an enclosing scope must be final or effectively 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 表达式来实现这一点。??

最佳答案

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

Java 8 引入了 的新概念最终生效 ,这意味着编译器会检查使用的变量是否在使用中是最终的,并且不会强制开发人员将其显式声明为最终的。

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

final List<RestaurantOrderBook> itemList = new ArrayList<RestaurantOrderBook>();

你会看到,编译器给你一个错误:
itemList = mongoTemplate.find(query, RestaurantOrderBook.class);

因为你要重新签约 itemList .这就是为什么 itemList 也不是有效的最终结果。如果你挤压这两行
List<RestaurantOrderBook> itemList = mongoTemplate.find(query, RestaurantOrderBook.class);

它应该工作。

关于Java 8 显示此错误。在封闭作用域中定义的局部变量 itemList 必须是 final 或有效 final,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42831808/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com