Skip to content

Instantly share code, notes, and snippets.

Manabu Nakamura gakuzzzz

View GitHub Profile
@gakuzzzz
gakuzzzz / 0.md
Last active Apr 2, 2019
EnumReverseLookup
View 0.md

共通コード

public class EnumReverseLookup<E extends Enum<E>, ATTR> {

    private final Class<E> enumClass;
    private final Function<E, ATTR> getter;

    public EnumReverseLookup(final Class<E> enumClass, final Function<E, ATTR> getter) {
        this.enumClass = enumClass;
View MyBiFunc.java
package jp.t2v.lab;
import java.util.function.Function;
@FunctionalInterface
public interface MyBiFunc<T, U, R> extends Function<T, Function<U, R>> {
@Override
default Function<U, R> apply(T t) {
return u -> apply(t, u);
@gakuzzzz
gakuzzzz / 0_readme.md
Last active Feb 19, 2019
Java Stream API で foldLeft/foldRight
View 0_readme.md

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 Dec 25, 2018
Spring で 値クラス変換
View index.md

やりたい事

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

ソース

値っぽいクラス

View 0_.md
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 Oct 26, 2018
Mock/Stub 切り替え
View 0_index.md

実装

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

Monoid で 集約操作を簡単に

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

自己紹介

  • 中村 学(Nakamura Manabu)
  • @gakuzzzz
  • Tech to Value 代表取締役
@gakuzzzz
gakuzzzz / design_pattern_in_scala.md
Last active Feb 24, 2019
Design Patterns in Scala (ScalaMatsuri 2018 Unconfoerence)
View design_pattern_in_scala.md

Design Patterns in Scala

Scala でよく見るパターン

Type-Safe Builder

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

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

@gakuzzzz
gakuzzzz / FooDao.java
Last active Nov 19, 2017
Doma2 で IN 句の最大数を固定したメソッドだけ public にしたい
View FooDao.java
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 Feb 25, 2018
MonadTransformer とは何か
View index.md

MonadTransformer とは何か

注意書き

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

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

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

You can’t perform that action at this time.