2016-11-25 3 views
0

Ich habe ein Paket namens Things. In diesem Paket gibt es regelmäßige und abstrakte Klassen wie Obst, Lebensmittel, gekühlt haltbar, Schuhe, Artikel usw. Ich möchte einen Filter erstellen, der diese beim Anklicken filtern würde. Zum Beispiel würde das Klicken auf die Schaltfläche Obst nach Früchten filtern. In einem separaten Paket namens CODE habe ich 4 Klassen, von denen jede eine Funktion wie das Importieren meiner Daten und Methoden, das Ausführen der App, der GUI und des Controllers bietet. Ich habe die GUI-Klasse eingerichtet, um die Schaltfläche anzuzeigen. Ich bin jedoch verwirrt darüber, wie Java meine Elemente in der "Listening" -Klasse filtern kann - eine Klasse, die auf die in der GUI-Klasse angeklickten Schaltflächen reagiert. Wie gehe ich beim Schreiben des Codes vor? Ich habe folgendes versucht, aber es funktioniert nicht. Muss ich dinge.food in den Code importieren?Filterung für Elemente in Java

In einem anderen Beitrag gab es diesen Code:

List<Person> beerDrinkers = persons.stream() 
.filter(p -> p.getAge() > 16).collect(Collectors.toList()); 

//Lets say I edit this to make it similar to my problem 
List<Item> Perishables = Food.stream() 
.filter(p -> p.getName()).collect(Collectors.toList()); 

, die nicht funktionieren würde, und es gibt mir Fehler. Könnte jemand erklären, wie dieser Code funktioniert und wie ich ihn auf mein Problem anwenden könnte?

// I currently have this empty in my controller class to use as a filter. Am I suppose to filter over here or in the class that holds the methods? 
else if(text.equals("Food")){ 
    } 

Paket Produkte; öffentliche abstrakte Klasse Lebensmittel erweitert Artikel {

String Expiration_Date; 

public String toString() 
{ 
    return super.toString() + ", Expiration: " + Expiration_Date; 
} 
} 

package Products; 

public class Fruit extends Perishable { 

public Fruit(String s) 
{ 
    StringTokenizer stk = new StringTokenizer(s); 

    stk.nextToken(); 

    this.Item_name = stk.nextToken(); 
    this.Item_code = stk.nextToken(); 
    this.price = Double.parseDouble(stk.nextToken()); 
    this.Expiration_Date = stk.nextToken(); 
    if (stk.nextToken().compareTo("false") == 0) 
     this.flag = false; 
    else 
     this.flag = true; 
    this.inventory = Integer.parseInt(stk.nextToken()); 

} 

public String toString() 
{ 
    return super.toString(); 
} 

} 
+0

Es gibt eine Sache, die meine Aufmerksamkeit gebracht hat, haben Sie Code: Filter (p -> p.getName()). Funktion, die an Filter übergeben wird, sollte einen booleschen Wert zurückgeben, Funktionsname getName, der den vom Filter verwendeten Wert zurückgibt, sugget return wird nicht boolesch sein. – user902383

+0

durch hinzufügen, könnten Sie Fehler hinzufügen, die Sie bekommen? das könnte einige Probleme beheben – user902383

Antwort

-1

Der Code, den Sie genannt wird, unter Verwendung von JDK 1.8. Sie sollten Ihre jdk-Version überprüfen, indem Sie javac -version in der Konsole ausführen.

List<Item> foods = perishables.stream() 
.filter(p -> p.getSimpleName().equals("Food")).collect(Collectors.toList()); 

Bezugnehmend auf die Quelle, Essen ist eine Liste für Artikel? List.stream() gibt Stream-Schnittstelle mit der Sammlung zurück. Stream ist eine Schnittstelle von JDK 1.8, mit der ein Abschluss zum Betrieb des Collection-Elements erstellt werden kann. Sie sollten einen Bool-Wert in der Filtermethode zurückgeben.

stream() ist eine Methode der Klasse, die Sammlung implementiert, so verwenden wir diese Methode von einer Arraylist (oder anderen) verderblichen Strom Schnittstelle mit verderblichen Gegenständen zu erhalten. Verwenden Sie dann die Filtermethode filter Verderbliche Objekte und geben Sie einen neuen Stream mit gefilterten Objekten zurück. Verwenden Sie abschließend collect (Collectors.toList()), um gefilterte Objekte in einer ArrayList zu sammeln.

BTW Class.getSimpleName kann einen kurzen Klassennamen ohne Paketnamen zurückgeben.

+0

Wie würde ich dann dieses Problem angehen? Ich nehme an, ich habe die neueste Version von JDK, da ich das neue Betriebssystem für Mac verwende. –

+0

Hallo, ich habe beigefügt, wie diese Klassen aussehen, ich bin nicht großartig mit der Terminologie. –

+0

Ich denke, dass Sie besser diese jdk-Version überprüfen sollten, weil wir das in den meisten Fällen nicht installieren werden. Stream mit Lamdba kann ** nur ** in der Version verwendet werden. Wenn der jdk älter ist als das, können Sie einen weiteren jdk installieren und einen spezifischen Compiler in Ihrer IDE setzen. [JDK1.8] (http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads- 2133151.html) –