无法在原始类型void上调用forEach((<no type =“”> de)-> {})

时间:2018-10-21 20:36:14

标签: java collections java-8

我有一个元素列表,我想在forEach元素内创建一个构造函数,但出现错误:无法在原始类型void上调用forEach((de)-> {}) >

List<MatchEventMobileApp> matchEventMobileApp 
    = new ArrayList<matchEventMobileApp>();


matchEventService
    .findAllByMatch(“JVT”))
        .sort(Comparator.comparing(MatchEvent::getDateReceived))
        .forEach(de -> matchEventMobileApp.add(new MatchEventMobileApp(de)));



public List<MatchEvent> findAllByMatch(Match match) {

        return matchEventRepository.findAllByMatch(match);

    }

2 个答案:

答案 0 :(得分:3)

findAllByMatch方法返回一个List<MatchEvent>

List.sort(someComparator)方法返回void,即它什么也不返回,因为它对列表进行了原位排序。因此,您无法将通话链接到forEach(someConsumer)

解决您问题的一种方法是使用Stream而不是List

List<MatchEventMobileApp> matchEventMobileApp = matchEventService
    .findAllByMatch(SOME_MATCH)
        .stream()
        .sorted(Comparator.comparing(MatchEvent::getDateReceived))
        .map(de -> new MatchEventMobileApp(de)) // or MatchEventMobileApp::new
        .collect(Collectors.toList()); // better collect to a new list instead of
                                       // adding to an existing one within forEach

这样,您现在正在使用Stream,其sorted方法将返回另一个Stream(已排序的),您可以在其上调用终端操作< / em>,例如collectforEachanyMatch

另一种可能性是将列表提取到变量中并使用它:

List<MatchEvent> list = matchEventService.findAllByMatch(SOME_MATCH);

list.sort(Comparator.comparing(MatchEvent::getDateReceived));

list.forEach(de -> matchEventMobileApp.add(new MatchEventMobileApp(de)));

答案 1 :(得分:2)

List<MatchEventMobileApp> matchEventMobileApp 
    = matchEventService
        .findAllByMatch(“JVT”)
        .stream()
        .sorted(Comparator.comparing(MatchEvent::getDateReceived))
        .map(MatchEventMobileApp::new)
        .collect(Collectors.toList());