2016-05-30 1 views
4

Wie der Titel sagt, habe ich ein Problem, wenn ich versuche, ein Stück Code zu kompilieren, der eine Kette von Stream-Operationen hat.Maven kann Java mit einer Kette von Stream-Operationen nicht kompilieren

Die in der IDE nicht geschieht (versucht mit Eclipse und IntelliJ), aber wenn ich ein 'mvn saubere Installation' in der Konsole versuche, wirft es die folgenden Fehler:

[ERROR] .collect(Collectors.joining("&")); 
[ERROR] ^^^^^^^ 

[ERROR] The method collect(Collector<? super Object,A,R>) in the type Stream<Object> is not applicable for the arguments (Collector<CharSequence,capture#1-of ?,String>) 
[ERROR] 
[ERROR] Found 1 error and 0 warnings. 
[ERROR] -> [Help 1] 

Testcode:

package com.stackoverflow.test; 

import java.util.ArrayList; 
import java.util.List; 
import java.util.stream.Collectors; 

public class StreamMavenTest { 


    public static void main(String[] args) { 
     List<Department> depts = initDepts(); 
     String unpaidReferences = depts.stream() 
       .flatMap(dpto -> dpto.people.stream() 
         .filter(ppl -> ppl.lastname != null && ppl.name != null) 
         .map(ppl -> ppl.name + "|" + ppl.lastname)) 
       .collect(Collectors.joining("&")); 
     System.out.println(unpaidReferences); 
    } 

    private static List<Department> initDepts() { 
     List<Department> depts = new ArrayList<Department>(); 
     Department dep1 = new Department(); 
     dep1.people = new ArrayList<Person>(); 
     dep1.people.add(new Person("Baudouin","Quy")); 
     dep1.people.add(new Person("Sigmund","Zebedaios")); 
     dep1.people.add(new Person("Bernd","Edwyn")); 
     depts.add(dep1); 
     Department dep2 = new Department(); 
     dep2.people = new ArrayList<Person>(); 
     dep2.people.add(new Person("Olanrewaju","Jorgen")); 
     dep2.people.add(new Person("Stanislovas","Adalberto")); 
     dep2.people.add(new Person("Manuel","'Avshalom")); 
     depts.add(dep2); 
     return depts; 
    } 

    public static class Department{ 
     List<Person> people; 
    } 


    public static class Person{ 
     String name; 
     String lastname; 

     public Person(String name, String lastname){ 
      this.name = name; 
      this.lastname = lastname; 
     } 
    } 

} 

Nun, wenn ich die Hauptmethode für diese Änderung:

public static void main(String[] args) { 
    List<Department> depts = initDepts(); 
    Stream<String> flatMap = depts.stream() 
      .flatMap(dpto -> dpto.people.stream() 
        .filter(ppl -> ppl.lastname != null && ppl.name != null) 
        .map(ppl -> ppl.name + "|" + ppl.lastname)); 
    String unpaidReferences = flatMap 
      .collect(Collectors.joining("&")); 
    System.out.println(unpaidReferences); 
} 

Es funktioniert perfekt.

Dinge im Auge zu behalten:

  • Beide IDE und Maven verwenden gleiche Java-Version.
  • Java-Version: 1.8.0_60.
  • Maven-Version: 3.3.3.

  • Console Ausgabe der Haupt-Ausführung: Baudouin | Quy & Sigmund | Zebedaios & Bernd | Edwyn & Olanrewaju | Jorgen & Stanislovas | Adalberto & Manuel | 'Avshalom

Wer noch keine Ahnung hat, warum dies geschieht? Ich glaube, es hat etwas mit der FlatMap und dem Stream in diesem Lambda zu tun, aber ich bin mir nicht sicher.

Danke für Ihre Zeit.

+2

Ich kann das mit JDK 1.8.0_74 (mit Maven 3.3.9) nicht reproduzieren. Das erste Snippet wird korrekt kompiliert. – Tunaki

+0

Sie müssen die Build-Plugins-Einstellungen von Ihrem Pom veröffentlichen, bevor wir wirklich mit Maven-Problemen helfen können. –

+0

@Tunaki hat eine gute Idee, eine Reihe von Stream-Problemen wurden in 'javac'-Patches angesprochen. Eclipse wird einen anderen Compiler als Maven verwenden. Probieren Sie die neueste Version von Java aus, dies funktionierte, als ich auf ein ähnliches Problem stieß. – Pace

Antwort

0

Versuchen Sie, JAVA_HOME vor dem Aufruf von mvn zu exportieren. Scheint, dass du Java7 als Standard hast.

Verwandte Themen