最初に直接関係ない話ですが、値がnullの可能性があるかないかでOptional.ofとOptional.ofNullableは使い分けた方がよいと思います。
それはそれとして、以下のような感じではいかがでしょう
java
1import java.sql.Date;
2import java.text.ParseException;
3import java.text.SimpleDateFormat;
4import java.util.Optional;
5import java.util.stream.Collectors;
6import java.util.stream.Stream;
7
8public class Boo {
9 public static void main(String[] args) {
10 Optional<Date> d1 = Optional.of(new Date(sdf.parse("2018-01-01").getTime()));
11 Optional<Date> d2 = Optional.of(new Date(sdf.parse("2018-02-02").getTime()));
12 Optional<Date> dn = Optional.empty();
13
14 System.out.println(buildCondition(d1, d2));
15 System.out.println(buildCondition(d1, dn));
16 System.out.println(buildCondition(dn, d2));
17 }
18
19 static String buildCondition(Optional<Date> from, Optional<Date> to) {
20 return Stream.of(
21 from.map(d -> "DATE >= " + fmt(d)),
22 to.map(d -> "DATE <= " + fmt(d))
23 ).flatMap(Optional::stream).collect(Collectors.joining(" AND "));
24 }
25
26 static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
27
28 static String fmt(Date date) {
29 return sdf.format(date);
30 }
31}
==>
DATE >= 2018-01-01 AND DATE <= 2018-02-02
DATE >= 2018-01-01
DATE <= 2018-02-02
ご質問にあるコードからPreparedStatementのsetDateは使わない想定のようでしたので、日付はリテラルとしてフォーマットするようなコードにしています。フォーマットの仕方そのものはいいかげんです。
追記:Java9前提です。Java8にはOptional#stream()がありませんので。
追記2:Java8で上記の方針とするならちょっと長めのコードになりますね。
.flatMap(Optional::stream).~
=>
.flatMap(o -> o.map(Stream::of).orElseGet(Stream::empty)).~
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/24 15:41
2018/03/25 01:54