作者SongIceFire (冰與火之歌)
看板java
標題[問題] java 觀念請益
時間Fri Feb 5 07:21:09 2021
主要是來自於這個問題以及 github
https://stackoverflow.com/questions/32209248/java-util-stream-with-resultset
https://github.com/claudemartin/streamed-sql
在 Example.java 中
...
strsql.stream("SELECT * FROM FOO WHERE NAME LIKE 'L%' ORDER BY NAME", Foo::o
f))
...
這個
Foo::of 是建構式參考
但在 StreamedSQL.java 中 strsql.stream() 這個方法簽署傳入的是介面
public <T> Stream<T> stream(final String query, final ResultSetMapper<T> map
per) throws SQLException {
return stream(this.getDefConn(), query, mapper);
}
只知道靜態方法簽署中參數與回傳值相同所以可使用建構式參考
但不清楚為何傳入的是 ResultSetMapper 介面
以及從何得知T的實際型態為 Foo
另外 Foo::of 可以改用 lambda 寫嗎
謝謝
----
Sent from
BePTT
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 223.136.97.104 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/java/M.1612480872.A.ECB.html
1F:→ ssccg: 不是得知T型態為Foo,是因為用了Foo::of所以T才確定是Foo02/05 09:30
2F:→ ssccg: 方法或建構式參考就是參數和回傳值跟函式介面的方法一樣就02/05 09:34
3F:→ ssccg: 能拿來當介面實作,Foo::of 是 (ResultSet) -> Foo02/05 09:37
4F:→ ssccg: ResultSetMapper<T>的map是 (ResultSet) -> T02/05 09:37
5F:→ ssccg: 所以Foo::of可以實作ResultSetMapper<Foo>02/05 09:38
6F:→ SongIceFire: 先謝謝,我先再翻一下書看看這部分02/06 04:24
不要用 lambda 寫反而很清楚
謝謝
....
try (final var conn = initDB()) {
final var strsql = StreamedSQL.create(conn, true);
try (Stream<Foo> stream = strsql.stream("select ... ", new ResultSetMapper<Foo>(){
@Override
public Foo map(ResultSet rs) throws SQLException{
return Foo.of(rs);
}
})) {
stream.filter(....);
}
}
....
※ 編輯: SongIceFire (223.136.97.104 臺灣), 02/06/2021 13:00:10