Skip to content

Instantly share code, notes, and snippets.

View gakuzzzz's full-sized avatar

Manabu Nakamura gakuzzzz

View GitHub Profile
@gakuzzzz
gakuzzzz / 0_readme.md
Last active February 26, 2021 11:20
Java Stream API で foldLeft/foldRight

Java8以降の Stream API で畳み込みを行いたい場合は Stream#reduceCollectors.reducing を使用します。

しかし、Stream API は基本的に parallel で動作する事を考慮に入れる必要があるため、Stream#reduce および Collectors.reducing には強い制約があります。 つまり、初期値は必ず単位元である必要があり、演算は結合則を満たす必要があります。

試しにその制約を満たしていない引数を渡すと、結果が定まらない事が見て取れます。 例えば 50 という初期値から 1~100 までの数値を順番に引いていくと -5000 になるはずです。

IntStream.rangeClosed(1, 100).boxed().parallel().reduce(50, (a, b) -> a - b, (a, b) -> a + b); // -3250 になる
@gakuzzzz
gakuzzzz / index.md
Last active December 25, 2018 10:57
Spring で 値クラス変換

やりたい事

  • 以下みたいな ID<T>Name<T> みたいな値っぽいクラスのインスタンスを Controller の引数として受け取りたい。
  • ID<T> みたいなクラスは随時増えるので、増えるたびに Converter まで作るのを避けるために AbstractAtomConverterFactory を定義して一度で済ませたい。
  • ConverterFactory どうやって書けばいいのん?

ソース

値っぽいクラス

@gakuzzzz
gakuzzzz / 0_.md
Created October 28, 2018 07:37
Byte Int
scala> val b1: Byte = 127
b1: Byte = 127

scala> val b2: Byte = 128
<console>:7: error: type mismatch;
 found   : Int(128)
 required: Byte
       val b2: Byte = 128
@gakuzzzz
gakuzzzz / 0_index.md
Last active October 26, 2018 02:12
Mock/Stub 切り替え

実装

class HogeService {
  val mailer: MailSender = new MailSender()
  
  def foo(): Bar = {
    ...
    mailer.send(mail)
 ...
@gakuzzzz
gakuzzzz / 0.md
Last active June 16, 2018 07:53
Yokohama.scala 第一回

Monoid で 集約操作を簡単に

Yokohama.scala 2018/06/16 At 株式会社アットウェア

自己紹介

  • 中村 学(Nakamura Manabu)
  • @gakuzzzz
  • Tech to Value 代表取締役
@gakuzzzz
gakuzzzz / design_pattern_in_scala.md
Last active February 12, 2024 02:05
Design Patterns in Scala (ScalaMatsuri 2018 Unconfoerence)

Design Patterns in Scala

Scala でよく見るパターン

Type-Safe Builder

Javaで多引数のコンストラクタを避けるために使われる Builder パターンは、Scala では名前付き引数呼び出しが使えるので必要ありません。

Builderパターンに制約を加えて条件に合わない場合、コンパイルエラーにしたい。

@gakuzzzz
gakuzzzz / FooDao.java
Last active November 19, 2017 07:06
Doma2 で IN 句の最大数を固定したメソッドだけ public にしたい
package example
import 省略
public interface FooDao {
/** Doma2 が生成するこのメソッドは private にしたい。 */
@Select(strategy = SelectType.STREAM)
@Suppress(messages = { Message.DOMA4274 })
private Stream<Foo> findByIdsInternally(List<FooId> ids);
@gakuzzzz
gakuzzzz / index.md
Last active March 20, 2024 15:48
MonadTransformer とは何か

MonadTransformer とは何か

注意書き

この記事は Monad がわかる人に向けた MonadTransformer の解説記事です。

すごいH本や FP in Scala などでモナドまではイメージが掴めたけれど、モナドトランスフォーマーが何かわからない、という層をターゲットに想定しています。

基本的に Functor, Applicative, Monad および型クラスについては把握しているものとしますので、この辺があやふやな方は別の資料などをご参照下さい。

TailRec<BigInteger> fib(final BigInteger n) {
return n.compareTo(two) < 0
? TailRec.done(n)
: Optional.ofNullable(memo.get(n)).map(TailRec::done).orElseGet(() ->
TailRec.call(() -> fib(n.subtract(one))).flatMap(a ->
TailRec.call(() -> fib(n.subtract(two)).map(b -> {
final BigInteger m2 = a.add(b);
memo.put(n, m2);
return m2;
}))
@gakuzzzz
gakuzzzz / TicketRepo.scala
Last active October 14, 2017 20:54
Scala入門者向けハンズオン #2 解答
package app.model
object TicketRepo {
private var tickets: Map[TicketId, Ticket] = Map(
1 -> new Issue(1, "First Issue"),
2 -> new Issue(2, "Seccond Issue"),
3 -> new Bug(3, "Fisrt Bug", TicketStatus.Open, "sample"),
4 -> new Bug(4, "Closed Issue", TicketStatus.Fixed, "fixed")
)