#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
.