10
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Java8のLambda用Interfaceの命名規則

Last updated at Posted at 2014-03-19

前回、Javaの命名規則がよくわからんと言ったので、頑張って探してみた。

プログラマなら、文章読むより、コード見たほうがうれしいよね。

Ideoneで作業したせいで1ファイルでやってしまった

java_lambda_name.rb
module JavaLambdaName
  PKG = 'java.util.function.'

  module_function

  # ===== ===== ===== ===== MAIN ===== ===== ===== =====

  def infer(types)
    *params, ret = *types

    return consumer(params)           if ret == 'void'
    return supplier(ret)              if params.size == 0
    return predicate(params)          if ret == 'boolean'
    return operator(ret, params.size) if params.all?{ |x| ret == x }
    return function(ret, params)
  end

  # ===== ===== ===== ===== Lambda Type ===== ===== ===== =====

  def consumer(params)
    if params.size == 0
      return 'java.lang.Runnable', 'run'
    else
      return common_signature(params, 'Consumer', 'accept')
    end
  end
  def supplier(ret)
    return PKG + cap(ret) + 'Supplier', 'get' + cap(ret, 'As')
  end

  def predicate(params)
    return common_signature(params, 'Predicate', 'test')
  end

  def common_signature(params, c, m)
    if params.all?{ |x| generic? x }
      prefix = params.size == 2 ? 'Bi' : ''
    else
      prefix = params.map{|x| generic?(x) ? 'Obj' : x.capitalize }.join
    end
    return PKG + prefix + c, m
  end

  def operator(ret, n)
    rank = n == 1 ? 'Unary' : 'Binary'
    return PKG + cap(ret) + rank + 'Operator', 'applyAs' + cap(ret)
  end

  def function(ret, params)
    from = params.map{ |x| cap x }.join
    rank = params.size == 2 ? 'Bi' : ''

    return PKG + from + cap(ret, 'To') + rank + 'Function', 'apply' + cap(ret, 'As')
  end

  # ===== ===== ===== ===== HELPERS ===== ===== ===== =====

  def generic?(type)
    type.length == 1
  end

  def cap(type, prefix = '')
    if generic? type
      return ''
    else
      return prefix + type.capitalize
    end
  end
end

def test
  ok = []
  ng = []

  DATA.each_line do |line|
    line.strip!
    if /\| (?<expr>[^\|]+) \| (?<klass>[^\|]+) \|/ =~ line
      types = expr.split(/\W+/).select{|x| x.size > 0 }
      expect = klass
      actual = JavaLambdaName.infer(types).join(".")
      if expect == actual
        ok << "OK: #{expect}"
      else
        ng << "NG: #{expect} expected, but was #{actual}"
      end
    end
  end
  puts "#{ng.size} data failed."
  ng.each do |line|
    puts "\t" + line
  end
end
test


__END__
| () -> void                 | java.lang.Runnable.run |
| (T, U) -> void             | java.util.function.BiConsumer.accept |
| (T, U) -> R                | java.util.function.BiFunction.apply |
| (T, U) -> boolean          | java.util.function.BiPredicate.test |
| () -> boolean              | java.util.function.BooleanSupplier.getAsBoolean |
| T -> void                  | java.util.function.Consumer.accept |
| (double, double) -> double | java.util.function.DoubleBinaryOperator.applyAsDouble |
| double -> void             | java.util.function.DoubleConsumer.accept |
| double -> R                | java.util.function.DoubleFunction.apply |
| double -> boolean          | java.util.function.DoublePredicate.test |
| () -> double               | java.util.function.DoubleSupplier.getAsDouble |
| double -> int              | java.util.function.DoubleToIntFunction.applyAsInt |
| double -> long             | java.util.function.DoubleToLongFunction.applyAsLong |
| double -> double           | java.util.function.DoubleUnaryOperator.applyAsDouble |
| T -> R                     | java.util.function.Function.apply |
| (int, int) -> int          | java.util.function.IntBinaryOperator.applyAsInt |
| int -> void                | java.util.function.IntConsumer.accept |
| int -> R                   | java.util.function.IntFunction.apply |
| int -> boolean             | java.util.function.IntPredicate.test |
| () -> int                  | java.util.function.IntSupplier.getAsInt |
| int -> double              | java.util.function.IntToDoubleFunction.applyAsDouble |
| int -> long                | java.util.function.IntToLongFunction.applyAsLong |
| int -> int                 | java.util.function.IntUnaryOperator.applyAsInt |
| (long, long) -> long       | java.util.function.LongBinaryOperator.applyAsLong |
| long -> void               | java.util.function.LongConsumer.accept |
| long -> R                  | java.util.function.LongFunction.apply |
| long -> boolean            | java.util.function.LongPredicate.test |
| () -> long                 | java.util.function.LongSupplier.getAsLong |
| long -> double             | java.util.function.LongToDoubleFunction.applyAsDouble |
| long -> int                | java.util.function.LongToIntFunction.applyAsInt |
| long -> long               | java.util.function.LongUnaryOperator.applyAsLong |
| (T, double) -> void        | java.util.function.ObjDoubleConsumer.accept |
| (T, int) -> void           | java.util.function.ObjIntConsumer.accept |
| (T, long) -> void          | java.util.function.ObjLongConsumer.accept |
| T -> boolean               | java.util.function.Predicate.test |
| () -> T                    | java.util.function.Supplier.get |
| (T, U) -> double           | java.util.function.ToDoubleBiFunction.applyAsDouble |
| T -> double                | java.util.function.ToDoubleFunction.applyAsDouble |
| (T, U) -> int              | java.util.function.ToIntBiFunction.applyAsInt |
| T -> int                   | java.util.function.ToIntFunction.applyAsInt |
| (T, U) -> long             | java.util.function.ToLongBiFunction.applyAsLong |
| T -> long                  | java.util.function.ToLongFunction.applyAsLong |
| T -> R                     | java.util.function.Function.apply |
10
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?