Java8 Lambda могу ли я сгенерировать новый список объектов

#java #jpa #lambda #java-8

#java #jpa #лямбда #java-8

Вопрос:

Я хотел бы знать, есть ли способ уменьшить этот метод, поскольку единственное, что меняется, — это счетчик для получения значения.

 List<Vo> response = daoImpl.getresult(query).stream.map(
  t-> new Vo( t.get(0,Object.class),

    t.get(1,Object.class),

    t.get(2,Object.class),

    t.get(3,Object.class),

    t.get(4,Object.class), 

    t.get(5,Object.class),

    t.get(6,Object.class), new vo2(

        t.get(7,Object.class),

       t.get(8,Object.class)

))).collect(Collectors.toList());
 

Мои классы Vo

 Public class Vo(){

private Object param1;
private Object param2;
private Object param3;
private Object param3;
private Object param4; 
private Object param5; 

private Object param6;
private Vo2 info;

--Getter and setter
 }
 

Мои классы Vo2

 Public class Vo2 (){

   private Object param7;
   private Object param8;

   --Getter and setter

}
 

метод get принадлежит классу dao, который возвращает список типа Tuple, этот метод получает значение элемента, указанного в позиции в результирующем кортеже, первая позиция равна 0

Я хотел бы знать, можно ли сократить код с помощью IntStream.

Я предпринял попытку, но я не знаю, как конструктор мог бы это сделать, и перейти с позиции 0 на 6 Я принадлежу объекту, а с 7 на 8 — другому

 List<Tuple> list =daoImpl.getresult(query);

list.stream().map(v-> new Vo(IntStream.range(0,6).mapToObj(h-> v.get(h,Object.class)))). collect(Collectors.toList());
 

Ответ №1:

Основываясь на моей интерпретации того, что вы хотите

  • это создает два массива объектов из t.get .
  • первый массив будет одним из аргументов Vo конструктора класса.
  • второй массив будет аргументом конструктора Vo2 класса.
  • тогда результирующий Vo2 класс будет вторым аргументом Vo конструктора класса.
  • они упаковываются в массивы объектов для создания Vo объекта.

Возможно, вам придется выполнить некоторое приведение массивов в конструкторе, а также выполнить итерацию по массивам, чтобы назначить отдельные поля (или просто сохранить их в виде массивов, что может быть проще).

 List<Vo> response = daoImpl.getresult(query).stream

        .map(t -> new Object[][]{
           // create objecsts for 0 thru 6
           IntStream.rangeClosed(0,6)
                   .mapToObj(i->t.get(i, Object.class)).toArray(Object[]::new),
           // create objects for 7 thru 8              
           Intstream.rangeClosed(7,8)
                   .mapToObj(i->t.get(i,Object.class)).toArray(Object[]::new)}).
           // create the Vo object             
           map(ob->new Vo(ob[0], new Vo2(ob[1]))).collect(Collectors.toList());

class Vo {
    
    private Object param0;
    private Object param1;
    private Object param2;
    private Object param3;
    private Object param4;
    private Object param5;
    
    private Object param6;
    private Vo2 info;
    
    public Vo(Object[] objects0Thru6, Vo2 vo2with7and8) {
        // do something with these.
    }
    
//--Getter and setter
}
 

Комментарии:

1. Отлично, это было очень полезно, я благодарю вас

Ответ №2:

Как насчет

 List<Vo> response = daoImpl.getresult(query).stream.map(
t-> new Vo(
    IntStream.range(0, 9)
        .map(i -> t.get(1,Object.class))
        .toArray()
))).collect(Collectors.toList());
 

Вы можете использовать an IntStream для генерации 9 аргументов конструктора Vo .