Вопрос:

Я хочу, чтобы этот код был написан на Java8 с использованием Stream, Lambda Expression, Double Colon Operator

java for-loop lambda java-8 java-stream

33 просмотра

2 ответа

11 Репутация автора

Theres класс AllOrderItems, и в основном методе у нас есть несколько AllOrderItems, я должен проверить несколько атрибутов {AttriuteL "," AttriuteG "," AttriuteR "} присутствуют в любом порядке и собрать их, я написал это в обычном для цикла, но необходимо улучшить с помощью Java 8, используя Stream, лямбда-выражения и doublecolon

Хотите написать вид этого, как показано ниже

orderItems.stream()
                .anyMatch(customerOrderItem ->
                        attributeList.stream().map(customerOrderItem::getInstanceCharacteristicValue)
                                .filter(Objects::nonNull)
                                .allMatch(instanceCharacteristicValue ->
                                        !instanceCharacteristicValue.isEmpty()));
        System.out.println(check);

весь код:

public class AllOrderItems {

    private String OrderId;
    private String CustomerName;
    private int Quantity;
    private String AttriuteL;
    private String AttriuteG;
    private String AttriuteR;

    public String getAttriuteL() {
        return AttriuteL;
    }

    public void setAttriuteL(String AttriuteL) {
        this.AttriuteL = AttriuteL;
    }

    public String getAttriuteG() {
        return AttriuteG;
    }

    public void setAttriuteG(String AttriuteG) {
        this.AttriuteG = AttriuteG;
    }

    public String getAttriuteR() {
        return AttriuteR;
    }

    public void setAttriuteR(String AttriuteR) {
        this.AttriuteR = AttriuteR;
    }

    public String getOrderId() {
        return OrderId;
    }

    public void setOrderId(String orderId) {
        OrderId = orderId;
    }

    public String getCustomerName() {
        return CustomerName;
    }

    public void setCustomerName(String customerName) {
        CustomerName = customerName;
    }

    public int getQuantity() {
        return Quantity;
    }

    public void setQuantity(int quantity) {
        Quantity = quantity;
    }


    public String getInstanceCharacteristicValue(String instanceCharacterstics){
        if(instanceCharacterstics.equals("AttriuteG"))
            return getAttriuteG();
        else if("AttriuteL".equals(instanceCharacterstics))
            return getAttriuteL();
        else
            return getAttriuteR();
    }
}


import java.util.*;
import java.util.stream.Collectors;

public class StreamPractise {

    public static void main(String[] args) {

        List<Student> studetnList = setStudentDetails();
        List<AllOrderItems> orderItems = setCustomerOrders();
        List<String> attributeList = Arrays.asList(new String[]{"AttriuteL", "AttriuteG", "AttriuteR"});

       List<String> orderItemValue = new ArrayList<>();
        for(String attribute: attributeList){
            for(AllOrderItems orders: orderItems){
               String val= orders.getInstanceCharacteristicValue(attribute);
               if(val != null && !val.isEmpty()){
                   orderItemValue.add(val);
               }
           }
       }

      System.out.println(orderItemValue);
    }


    private static List<AllOrderItems> setCustomerOrders() {
        AllOrderItems c1 = new AllOrderItems();
        AllOrderItems c2 = new AllOrderItems();
        AllOrderItems c3 = new AllOrderItems();


        c1.setOrderId("Ord4521");
        c1.setCustomerName("Ontereo");
        c1.setQuantity(3);

        c2.setOrderId("Ord2134");
        c2.setCustomerName("Rio");
        c2.setQuantity(5);
        c2.setAttriuteG("00100");
        c2.setAttriuteL("");
        c2.setAttriuteR("OF010");

        c3.setOrderId("Ord8475");
        c3.setCustomerName("Jack");
        c3.setQuantity(10);

        List<AllOrderItems> orderItems = new ArrayList<>();
        orderItems.add(c1);
        orderItems.add(c2);
        orderItems.add(c3);

        return orderItems;
    }
}

Требуется список значений, в которых присутствуют три атрибута, или также хорошо, если его возвращаемое значение true или false говорит о том, присутствуют все три атрибута или нет, означает, что есть возможность сказать, что один атрибут может быть пустым в каждом элементе заказа или отсутствовать в любом Элемент order, если какой-либо атрибут присутствует с любым значением, кроме нуля или пустым, то проверит следующий атрибут.

Автор: RAJU GORAI Источник Размещён: 11.08.2019 05:38

Ответы (2)


0 плюса

305465 Репутация автора

Я не уверен, как ваша попытка с Streams связана с оригинальным циклом for. Если вы хотите реализовать логику циклов с Streams, вам нужно что-то вроде этого:

List<String> orderItemValue = 
    attributeList.stream()
                 .flatMap(att -> orderItems.stream()
                                           .map(o -> o.getInstanceCharacteristicValue(att)))
                 .filter(val -> val != null && !val.isEmpty())
                 .collect(Collectors.toList());
Автор: Eran Размещён: 11.08.2019 05:49

0 плюса

11 Репутация автора

  orderItems.stream()
  .filter(orderItem -> !orderItem.getAttributeL().isEmpty()
  && !orderItem.getAttributeR().isEmpty()
  && !orderItem.getAttributeG().isEmpty())
  .collect(Collectors.toList())
Автор: Naveen Purmani Размещён: 11.08.2019 08:09
Вопросы из категории :
32x32