2016-03-27 9 views
0

Ich brauche nur Hilfe mit diesem einen Teil meiner Hausaufgaben. Die Anweisungen lauten wie folgt: Verwenden Sie Lambdas und Streams, um jede Rechnung ihrer PartDescription und Quantity zuzuordnen, sortieren Sie die Ergebnisse nach Menge, und zeigen Sie die Ergebnisse an.Mapping einer Sammlung von zwei Feldern in Java

Ich habe den größten Teil des Codes, aber was ich verwirrt bin, ist, wie ich nach Teilebeschreibung UND Menge zuordnen. Ich verstehe, wie man mit nur einem Feld, aber nicht mit zwei Feldern abbildet. Hier ist mein Code. Der letzte Teil ist wo ich anfange, die Hilfe zu brauchen. jetzt ist es nur von einem Teil Beschreibung abgebildet, aber ich brauche, indem ein Teil Bezeichnung und Menge

import java.util.*; 
import java.util.function.Function; 

public class ProcessInvoices { 

    public static void main(String[] args) { 

     //initialize array of invoice objects 
     Invoice[] invoices = { 
       new Invoice(83 , "Electric sander", 7 , 57.89), 
       new Invoice(24, "Power saw", 18, 99.99), 
       new Invoice(7, "Sledge hammer", 11, 21.50), 
       new Invoice(77, "Hammer", 76, 11.99), 
       new Invoice(39, "Lawn mower", 3, 79.50), 
       new Invoice(68, "Screwdriver" ,106, 6.99), 
       new Invoice(56, "Jig saw", 21 ,11.00), 
       new Invoice(3, "Wrench" ,34, 7.50)}; 

     List<Invoice> list = Arrays.asList(invoices); 
     System.out.println("List of Invoice items: "); 
     list .stream() 
       .forEach(System.out::println); 

     //Fucnction for getting part information for sorting 
     Function<Invoice, String> byPartDescription = Invoice::getPartDescription; 
     Function<Invoice, Double> byPrice = Invoice::getPrice; 
     Function<Invoice, Integer> byQuantity = Invoice::getQuantity:; 

     //Comparator for invoice objects by part descsriprion 
     Comparator<Invoice> justPartDesc = 
       Comparator.comparing(byPartDescription); 

     //sort by part description 
     System.out.printf("%nInvoice objects in ascending order by part description: %n"); 
     list .stream() 
       .sorted(justPartDesc) 
       .forEach(System.out::println); 

     //Comparator for invoice by price 
     Comparator<Invoice> justPrice = Comparator.comparing(byPrice); 
     //sort by price 
     System.out.printf("%nInvoice Obejects sorted in ascending order by price: %n"); 
     list .stream() 
       .sorted(justPrice) 
       .forEach(System.out::println); 

     Comparator<Invoice> justQuantity = Comparator.comparing(byQuantity); 

     //map invoice to part descripiton and quantity 
     System.out.printf("%nInvoice objects mapped to part descripton and Quantity"); 
     list .stream() 
       .map(Invoice::getPartDescription) 
       .distinct() 
       .sorted() 
       .forEach(System.out::println); 

    } 
} 

Antwort

0

Verwenden lambdas und Bäche jede Rechnung an seine PartDescription und Menge

Wenn die Anweisungen explizit von einer Rechnung an einen PartDescription und Menge zu kartieren sagen abzubilden, Sie eine Klasse erstellen könnte, die eine PartDescription darstellt und eine Menge und Zuordnung von einer Rechnung zu einer Instanz Ihrer neuen Klasse PartDescriptionAndQuantity.

list.stream() 
    .map(invoice -> new PartDescriptionAndQuantity( 
     invoice.getPartDescription(), invoice.getQuantity()); 
    . ...[etc]... 

Auf der anderen Seite, wenn die Anweisungen, die Sie gerade zu Anzeigen wollen eine Bezeichnung und Menge (und aus der Rechnung, die Beschreibung und die Menge zu erhalten, sind billig), dann könnte man einfach die Rechnungen sortiert nach Menge, dann drucke nur die Beschreibung und Menge.

+0

ok das half. Ich habe nicht genau das gemacht, aber es hat mir die Idee gegeben, eine neue Methode in meiner Invoice-Klasse zu erstellen, die Teilbeschreibung und Menge erhält und ich in der Art verwendet habe. Vielen Dank – Cake771

-1

Sie && und || Operator kann abzubilden. Sie müssen die Logik des letzten Map-Arguments ändern und beide logischen Operatoren übergeben.

Verwandte Themen