使用Java 8中的lambda表达式打印列表(没有重复的项目)

时间:2016-05-27 10:01:56

标签: java lambda java-8 java-stream

我有什么

我有三节课。 Main.javaProducto.javaSupermercado.java

  • Main.java包含主要内容。
  • Producto.java我要在列表中打印的产品结构。
  • Supermercado.java是一个Singleton模式,代表我的List所在的超市。

代码

我只会向你们展示我认为与问题相关的代码,如果您需要更多信息,请不要犹豫。

Main.java

// Instanciar productos
Producto p1 = new Producto("Sal 100gr",  LocalDate.now(), 0.5f, 1);
Producto p2 = new Producto("Pimienta 25gr",  LocalDate.now(), 0.2f, 1);
Producto p3 = new Producto("Sal 1kg",  LocalDate.now(), 2, 1);
Producto p4 = new Producto("Te limón", LocalDate.now(), 3.5f, 2);
Producto p5 = new Producto("Azucar 1kg", LocalDate.now(), 2, 1);
Producto p6 = new Producto("Azucar 5kg", LocalDate.now(), 10, 1);
Producto p7 = new Producto("Xilitol 1kg", LocalDate.now(), 15, 1);
Producto p8 = new Producto("Xilitol 1kg", LocalDate.now(), 15, 1);

// Añadir productos a la lista del super
Supermercado.getSupermercado().addProducto(p1);
Supermercado.getSupermercado().addProducto(p2);
Supermercado.getSupermercado().addProducto(p3);
Supermercado.getSupermercado().addProducto(p4);
Supermercado.getSupermercado().addProducto(p5);
Supermercado.getSupermercado().addProducto(p6);
Supermercado.getSupermercado().addProducto(p7);
Supermercado.getSupermercado().addProducto(p8);

// Printing the list
System.out.println("\nLista productos.");
Supermercado.getSupermercado().printListaProductos();

// Printing distinct items (do not repeat xilitol plz)
System.out.println("\nLista de productos sin repetir.");
Supermercado.getSupermercado().printListaProductosSinRepetir();

Supermercado.java

// Printing the list
public void printListaProductos() {
    listaProducto.stream()
        .forEach(p -> System.out.println("Producto " +p.getNombre() 
            + '\t' + "Precio " + p.getPrecio() + "€"
            + '\t' + "Caducidad " + p.getFechaCaducidad()));
}

// Printing distinct items (do not repeat xilitol plz)
public void printListaProductosSinRepetir() {
    listaProducto.stream()
        .distinct()
        .forEach(p -> System.out.println("Producto " +p.getNombre() 
            + '\t' + "Precio " + p.getPrecio() + "€"
            + '\t' + "Caducidad " + p.getFechaCaducidad()));
}

Producto.java

private String nombre;
private int seccion;
private LocalDate fechaCaducidad;
private float precio;

// constructor
public Producto(String pNombre, LocalDate pFechaCaducidad, float pPrecio, int pSeccion) {
    this.nombre = pNombre;
    this.fechaCaducidad = pFechaCaducidad;
    this.precio = pPrecio;
    this.seccion = pSeccion;
}

public LocalDate getFechaCaducidad() {
    return this.fechaCaducidad;
}

public float getPrecio() {
    return this.precio;
}

public int getSeccion() {
    return this.seccion;
}

public String getNombre() {
    return this.nombre;
}

输出

Lista productos.
Producto Sal 100gr  Precio 0.5€ Caducidad 2016-05-27
Producto Pimienta 25gr  Precio 0.2€ Caducidad 2016-05-27
Producto Sal 1kg    Precio 2.0€ Caducidad 2016-05-27
Producto Te limón   Precio 3.5€ Caducidad 2016-05-27
Producto Azucar 1kg Precio 2.0€ Caducidad 2016-05-27
Producto Azucar 5kg Precio 10.0€    Caducidad 2016-05-27
Producto Xilitol 1kg    Precio 15.0€    Caducidad 2016-05-27
Producto Xilitol 1kg    Precio 15.0€    Caducidad 2016-05-27

Lista de productos sin repetir.
Producto Sal 100gr  Precio 0.5€ Caducidad 2016-05-27
Producto Pimienta 25gr  Precio 0.2€ Caducidad 2016-05-27
Producto Sal 1kg    Precio 2.0€ Caducidad 2016-05-27
Producto Te limón   Precio 3.5€ Caducidad 2016-05-27
Producto Azucar 1kg Precio 2.0€ Caducidad 2016-05-27
Producto Azucar 5kg Precio 10.0€    Caducidad 2016-05-27
Producto Xilitol 1kg    Precio 15.0€    Caducidad 2016-05-27
Producto Xilitol 1kg    Precio 15.0€    Caducidad 2016-05-27

问题

显然,.distinct()方法中的printListaProductosSinRepetir()代码对我不起作用。它应该显示:

Lista de productos sin repetir.
Producto Sal 100gr  Precio 0.5€ Caducidad 2016-05-27
Producto Pimienta 25gr  Precio 0.2€ Caducidad 2016-05-27
Producto Sal 1kg    Precio 2.0€ Caducidad 2016-05-27
Producto Te limón   Precio 3.5€ Caducidad 2016-05-27
Producto Azucar 1kg Precio 2.0€ Caducidad 2016-05-27
Producto Azucar 5kg Precio 10.0€    Caducidad 2016-05-27
Producto Xilitol 1kg    Precio 15.0€    Caducidad 2016-05-27

没有额外的Xilitol 1kg。这些项目不应重复。

为什么我需要这个

我正在尝试了解Java 8如何与Lambda-expressions一起使用。所以我为此建立了一些例子。问题是.distinct()无效。我在SO中找不到这个解决方案。提前谢谢。

2 个答案:

答案 0 :(得分:3)

您应该覆盖equals类中的hashCodeobject方法,以便在此处开展此工作是一个示例。 在Producto.java添加以下代码。

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((nombre == null) ? 0 : nombre.hashCode());
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Producto other = (Producto) obj;
    if (nombre == null) {
        if (other.nombre != null)
            return false;
    } else if (!nombre.equals(other.nombre))
        return false;
    return true;
}

答案 1 :(得分:1)

您应该覆盖equal

Producto功能

distinct()函数会删除重复的元素,具体取决于 对象的equal()

如果不覆盖equal()函数,则默认行为是与对象引用地址进行比较