Java入門・初心者質問スレ Part.10
レス数が1000を超えています。これ以上書き込みはできません。
次スレを立てる時は本文の1行目に以下を追加して下さい
!extend:on:vvvvv:1000:512
Java初心者のためのスレッドです。
※前スレ
Java入門・初心者質問スレ Part.9
https://mevius.5ch.net/test/read.cgi/tech/1552143555/
VIPQ2_EXTDAT: default:vvvvv:1000:512:: EXT was configured >>950
それはキャストしたあとにヌルチェックするのが不十分ということにはならんよね if分は三項演算子で十分と言ってるようなもので結局書き手の好みでしかないよ コストの差なんて誤差みたいなものだしキャストの前と後どちらでヌルチェックするかにこだわるのは時間の無駄だよ、それよりも将棋のアルゴリズムを考えたが良い たったこれだけのイディオムで書く書かない考えるまでもないだろ。
if (o == null || getClass() != o.getClass()) return false;
GoogleのAutoなんとかやIDEが勝手に追加してくれる。 >>955
一般的に同じクラスじゃないとequals() を真にしないほうがいいのでしょうか。
いままであまり考えずに insuranceOf() で子クラスも ok にしてました。 method(Object o)
というメソッドを呼び出す時、String型だろうがInteger型だろうが引数に渡すことができますが
method(List<Object> oList)
というメソッドに対してList<String>やList<Integer>を引数に渡す事ができないのはなぜでしょうか? >>957
仕様で禁止
仮にmethod(List<Object> oList)の中でoList.add("test")ってやってたら、List<Integer>を渡されたら困るでしょ
これができないのと同じこと
List<Object> objList;
List<Integer> intList = new ArrayList<>();
objList = intList; // コンパイルエラー
objList.add("数字じゃない"); >>956
実用上、どっちでもいいんじゃね。
その子クラスでもequals()を結局実装することになるだろうし、
そもそもデータクラスで継承使いたくないのもあるし。 JPAのhibernate.ddl-auto=updateって使ってる? 質問です
var stream = IntStream.range(0, 10).boxed();
このStreamから要素数を指定してグルーピングして
[0,1,2],[3,4,5],[7,8,9]
というStreamを得たいのですがどのようにデータを操作すれば良いですか?
Streamではこういうことできなかったりしますか? なぜ6が抜けてるのか...ミスだと仮定すると
Collection<List<Integer>> values = IntStream.range(0,10).boxed()
.collect(Collectors.groupingBy(i -> i / 3))
.values();
System.out.println(values);
実行結果
[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9]] >>962
ありがとうございます!
6はミスなので気にしないで大丈夫です
collectはStreamが終わってしまうんですよね
[0,1,2]...をStreamで逐次に読み出したいんですせっかくのStreamなので
グルーピングの処理を逐次でできるといんですけど 無理なんですかね、.NETのLINQのGroupByもシーケンス全部を読み取るようですし
条件を指定した場合は要素を全部見ないといけないんでしょうけど
先頭から数件ごとにグルーピングする場合は理屈としてはシーケンシャルに
読み取れるはずなのでStreamでやれればと思ったんですけど、難しいですねこれ
いったん諦めます、もしわかったかたおられたら教えて欲しいです
私はRxJavaを試してみます >>964 すまんグルーピングじゃなくてただのwindowか...
RxJavaなら
Observable.range(0, 9).window(3).subscribe(....)
Streamだと今思いつかない。 >>965
すごいです!
>>966
ありがとうございます! Kotlin もよろしく
Kotlinだとこうなる
val values = (1..10).chunked(3)
println(values)
出力
[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]] Kotlin使いてえ
来週会社に行ったらみんなJavaを書くのをやめてKotlinしか使ってない世界にならないかなあ
あ、転職すりゃいーのか >>968
chunkedが返すのは残念ながらList<List<T>> sequenceに変換してからchunkedを呼べばいいんじゃないの? >>971
Kotlin の場合は List のまま Java の Stream みたいに使えないか?
List のままでも特に困らないと思うんだが。何か問題ある? >>973
さあ。
Streamが書き易さのためだけにできたと思っているのなら。 >>973
Kotlin使いなのにまさかの初歩的質問だな
StreamとSequenceはパイプライン処理を抽象化したもので遅延評価される
振る舞いが違うし性能に差が出る
シーケンス図で説明できると早いんだが
1万件のリストを10回ずつmapとfilterして結果の先頭1件目を取り出す場合、リストなら必ず1万件全てに対して処理が走る
ストリームなら最初の1件目がお目当ての品だった場合、ストリームから後続の値が取り出されることすらなく処理が完了する そういう速さを求めるんだったら
そもそもJavaとかKotlinとか使わないと思う それってぼくは性能追求してないのでfor文で欲しいデータが見つかってもbreak全然書きませんって言ってるようなもんだ
Javaがよく使われる業務領域では社員数に応じてデータ量は増えるしRDBも絡む
小さなコレクションの基礎的な変形操作にしか活用してないならともかく、データの取り出し元がRDBだとか、繰り返し処理が全体に有意差を生むケースはいくらでも想定できる >>975
JavaのStreamってKotlinのSequenceと同じなの? >>978
同じではないよ
役割、使い所はほぼ重複している >>977
大部分のJavaプログラマはそういう理屈が分かっていないと思う >>975
なんで唐突に Sequence の話になっているのか? >>981
Kotlinならこう書けるというソースに対してList型なのが残念という流れだからStreamと併記しているんだよ
流れや文脈が理解できないアスペ的な人かな? 質問です
static finalのフィールドにHashMapをセットして
getしか行わない場合は、マルチスレッドで使用しても安全ですか?
↓こういうふうに、コードはイメージです
class Test {
private static final HashMap<String, String> map;
public Test() {
map = new HashMap<String, String>();
map.put("a", "A");
map.put("b", "B");
}
public String get(String key) {
return map.get(key);
}
} >>985
ダメです
コンストラクタではなくスタティックイニシャライザーで要素を追加してください >>986
ありがとうございます!
↓これなら良いですか? getはマルチスレッドでも安全ですか?
class Test {
private static final HashMap<String, String> map;
static {
map = new HashMap<String, String>();
map.put("a", "A");
map.put("b", "B");
}
public String get(String key) {
return map.get(key);
}
} valueがイミュータブルかどうかは無視していいの?
keyがイミュータブルでないってのはありえないだろうけど。 >>989
例の通りStringならね。
たとえば、Dateみたいなミュータブルだとどうなのって話。 >>987
たぶん安全だと思う
finalである時点で他スレッドからの即時の可視性も担保されてるはず
まあ思考を放棄してConcurrentHashMapを使ったほうが気が楽というのはある >>991
もちろん書き換えれば壊れるけど、質問者のレベルを察するに知りたいことはそこじゃないと思う >>991
それはConcurrentHashMap使っても無理でしょ
そのようなケースでは呼び出し側が読み取りから書き換えまでの範囲を排他するしかない Flow APIでPub/Sub処理作ってデバッグしてみたんだけど
eclipseもintellijも設定したブレイクポイントで止まってくれない
具体的にはSubscriberインターフェースを実装したクラスでpublishした時に呼ばれるonNextメソッドの部分
処理中にいくつかコンソール出力を仕込んであって途中までは呼び出されてるんだけどそこから先で止まってるっぽくてデバッグしたいんだけど
確認できてるコンソール出力処理より前にブレイクポイントを設定しても止まってくれない
Javaの標準クラスを経由して呼び出される独自のクラスはデバッグできないとか制約あったりするんだろうか? gradleでビルドしてるのだけどテストを除外してビルドするかんたんな方法はないの?
「テストを実行しない」ではなくテストコードそのものを生成物(jar)に入れたくないという意味で src/test 側に置いてたらソースセットの設定が効いてjarには入らないよ
jarに入る事故が起こってるのだとしたら多分スクリプトで余計なことしてる >>998
なるほどもともと入らないのか
知らなかった 100000000000000000000000000000000000000000000! このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 450日 23時間 1分 46秒 5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php レス数が1000を超えています。これ以上書き込みはできません。