【发布时间】:2020-04-22 23:49:12
【问题描述】:
我有 2 节课是这样的:
public class Seat extends Moviefiable {
private int number;
private Hall hall;
public Seat(int id, boolean active, int number, Hall hall) {
super(id, active);
this.number = number;
this.hall = hall;
}
public Seat() {this(-1, false, -1, null);}
public static Seat getById(int idSeat) throws SQLException {
Seat seat = SeatDAO.getById(idSeat);
return seat;
}
}
public class Ticket extends Moviefiable {
private Projection projection;
private Seat seat;
private LocalDateTime purchasingDate;
private User user;
public Ticket(int id, boolean active, Projection projection, Seat seat, LocalDateTime purchasingDate, User user) {
super(id, active);
this.projection = projection;
this.seat = seat;
this.purchasingDate = purchasingDate;
this.user = user;
}
public Ticket() {this(-1, false, null, null, null, null);}
现在,我需要创建两个或更多 Tickets,这取决于 loggedInUser 选择的票数。从我的JSP 页面,我会得到这样的信息:
String uri = request.getQueryString(); //uri looks like this: seats=2&seats=3
我想为两个 Seat 对象创建两个 Ticket 对象。在uri 字符串中,字符 2 和 3 是席位的主键。
这个想法是使用 Java 流来执行拆分和创建对象。这是我目前为止的。
ArrayList<Ticket> newTicketsForSeats = Stream.of(uri.split("&"))
.map(s -> s.split("seats=")[1])
//.flatMap(Arrays::stream)
.mapToInt(Integer::valueOf)
.mapToObj(s -> {
try {
return new Ticket(-1, true, projection, SeatDAO.getById(s),
LocalDateTime.now(), loggedInUser);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
})
.collect(Collectors.toCollection(ArrayList::new));
当我进行测试时,像这样查看我得到的输出:
Stream.of(uri.split("&"))
.map(s -> s.split("seats=")[1])
.mapToInt(Integer::valueOf)
.forEach(System.out::println); //2 3
没关系。但是当我运行上面的代码时,我得到了:
java.lang.ArrayIndexOutOfBoundsException: 1
at servlets.ConfirmPurchaseServlet.lambda$0(ConfirmPurchaseServlet.java:62)
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
projection也是我得到的对象,这只是参考,它在servlet的其他地方。 loggedInUser我从会话中得到。我是关于 Java 流的新手,任何额外的解释都会很好。
我知道map() 需要IntUnaryOperator lambda 表达式,如下所示:
s -> s * 10
我不知道如何从 int(Seat 的主键)“映射”到 Seat 对象。
干杯。
【问题讨论】:
-
我认为你需要
mapToObj而不是map... -
我将
map更改为mapToObj,第二个mapToObj报告错误:方法 mapToObj((s) -> {}) 未定义 Stream
标签: java java-stream flatmap