Skip to content

Instantly share code, notes, and snippets.

Manabu Nakamura gakuzzzz

Block or report user

Report or block gakuzzzz

Hide content and notifications from this user.

Learn more about blocking users

Contact Support about this user’s behavior.

Learn more about reporting abuse

Report abuse
View GitHub Profile
@gakuzzzz
gakuzzzz / 0_.md
Last active Aug 15, 2019
ScalikeJDBC の Batch API に ParameterBinderFactory をかますためのヘルパー的なやつ
View 0_.md

利用シーン

val emps: Seq[Emp] = ...
val column = Emp.column
val (placeholders, batchParams) = createBatchParams {
  emps.map { emp =>
    Seq(
      column.id   -> emp.id,
      column.name -> emp.name
@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 Jul 8, 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);
You can’t perform that action at this time.