あるプログラマの日記

プログラマのメモ、出来事、考えたこと、勉強とかの雑記

2012-01-01から1年間の記事一覧

高階関数、クロージャ

高階関数 関数を引数として受け取る関数または関数を返す関数のことを高階関数と呼ぶ。 文字列の引数 str を受け取って、「Int型整数を引数で受け取り文字列を返す関数」を返す。 scala> def foo(str: String) = (v: Int) => str + v foo: (str: String)(Int…

Ant で FindBugs のチェックを行う。

build.xml に findbugs の設定をしてソースコードのバグパターンチェックを行う。 .. <taskdef name="findbugs" classpath="lib/findbugs-ant.jar" classname="edu.umd.cs.findbugs.anttask.FindBugsTask"/> ... <target name="findbugs" depends="make"> </target></taskdef>

双方向のBiMap

ImmutableBiMap の inverse メソッドを使用してキーと値を反転させて値からキーも取得できる。 import com.google.common.collect.ImmutableBiMap; import com.google.common.collect.BiMap; ..snip.. private static final BiMap<Integer,String> bimap = ImmutableBiMap.of</integer,string>…

Google guava-libraries の Function Predicate Joiner

Function Function で List の要素を変換して、ループの記述無しで新しい List を作成する。 変換する条件は Function の applyメソッドに記述する。 import java.util.List; import com.google.common.base.Function; import com.google.common.base.Joiner…

テンポラリファイル作成

java でテンポラリファイルを作成してくれるメソッドがあった。 File#createTempFile 指定ディレクトリで新しい空のファイルを生成する。 そのファイル名には引数で指定した接頭辞、接尾辞が使用される。 このメソッドが正常に復帰する場合、以下が保証され…

アサーション

java の assert と同じように使用できる。 Predef の関数(メソッド)として定義されている。 scala> assert(0 < 1) scala> assert(0 > 1) java.lang.AssertionError: assertion failed at scala.Predef$.assert(Predef.scala:89) ..snip.. 2個の引数に条件を…

暗黙のインポート

Scala では暗黙に、すべてのプログラムで下の3つのインポート文を追加している。 import java.lang._ import scala._ import Predef._ scala._ scalaパッケージのすべて(Scalaの基本クラス) java.lang._ Javaの標準基本クラス Predef._ Predef オブジェクト…

シンボル、タプル、Option

シンボル シンボルは文字列のかわりに、マップのキーとして使われる事が多い。 シンボルは同じ名前の場合はメモリ上で同じオブジェクトを指す。 シンボルリテラルはシングルクォート(')の後に文字で始まりその後、0個以上の数字か文字が続く。 scala> 'foo r…

List の使い方(続き3)

リスト先頭から指定要素数の後のリストを得る。( drop ) scala> val foo = List(4, 5, 6, 7) foo: List[Int] = List(4, 5, 6, 7) scala> foo.drop(2) res0: List[Int] = List(6, 7) scala> foo.drop(1) res1: List[Int] = List(5, 6, 7) scala> foo.drop(3) …

List の使い方(続き2)

リストの長さを得る。 scala> List(4, 5, 6, 7).length res0: Int = 4 リストの末尾要素、リスト末尾以外の要素のリストを得るメソッド scala> val foo = List(4, 5, 6, 7) foo: List[Int] = List(4, 5, 6, 7) scala> foo.last res1: Int = 7 scala> foo.ini…

List の使い方(続き1)

空のリスト 空のリスト作成でいろいろ試してみる。 scala> val list = List.empty list: List[Nothing] = List() scala> val list2 = List() list2: List[Nothing] = List() scala> val list3: List[String] = Nil list3: List[String] = List() scala> val …

List の使い方(最初は作り方)

Scala の List はイミュータブル(変更不可能)なシーケンス List の空リストは () 又は Nil List の作成は、ファクトリメソッド( List(要素, ..) の形式 ) か :: を使う。 List に対して新しい要素を追加した List を作成する時は :: を使う。 List のファク…

可変長引数(続き)

可変長引数を受け取る関数定義の引数の型は Seq になっているので、List や Array を渡せそうだが そのまま渡すとエラーになる。 scala> def puts(s: String*) = s.foreach(print) puts: (s: String*)Unit scala> val list = List("bar1 ", "bar2 ", "bar3 "…

プログラミング言語の人気ランキング

TIOBE Software の PCI によるプログラミング言語人気ランキングというのを見つけた。 毎月公開しているようだ。 PCI(Programming Community Index)は、複数の検索エンジンの検索結果から対象の プログラミング言語がどれだけ話題になっているかをインデック…

シングルトンオブジェクト(続き)

上のソースのコンパイル後に生成される class ファイルは Foo.class 以外に Foo$.class が生成されていた。 Foo$.class には final class Foo$ extends scala.AnyRef with scala.ScalaObject という final class が自動生成されていた。 コップ本(初版ですが…

可変長引数

Scalaにも可変長引数があった。 メソッド定義の引数の型の後に * をつける。 object Foo { def main(argv: Array[String]) { put("aa","bb", "cc", "dd") put("AA", "BB") put() } def put(s: String*) { s.foreach(print); println } } コンパイル後の clas…

シングルトンオブジェクト

Scala ではすべてがオブジェクトのため Javaの static フィールド、クラスの定数、クラスメソッドはないがシングルトンオブジェクトの宣言 object をサポートしている。 object のメンバは、ちょうどjava のクラスの static フィールドメンバと同じような扱…

関数の型 の記述

関数の型は、(関数やメソッドの定義で)引数の型や戻り値の型に指定する。 (引数の型, …) => 戻り値の型引数の型を丸括弧で囲って、=> の次に戻り値の型を書く。 (Int, Long) => String(Int) => String引数が1個だけの場合は丸括弧を省略可能 Int => String引…

ちょっとだけ気になったこと

同パッケージ内の他の class の static 定数の参照 通常、他の class の static 定数(final 変数)を参照する場合は class名.定数名 ですが同パッケージ内にある他の class の static 定数を参照する場合は class 名の指定がなくてもコンパイルエラーにならな…

FindBugs の @NonNull @CheckForNull アノテーション

FindBugs の @NonNull アノテーションで引数や戻り値が null でないことを明示すると、可読性もよくなるし、間違って null の引数を指定したり、null を返すコードを書くと、FindBugs の指摘が入るので、不要な null チェックの冗長なコードが減少する。 imp…

guava-libraries の型推論してくれるファクトリメソッド

java JDK 6でジェネリクスの要素をもつコレクションの生成は長ったらしく冗長。 import java.util.ArrayList; import java.util.List; import java.util.HashMap; import java.util.Map; .. final List<String> list = new ArrayList<String>(); final Map<String, Integer> map = new HashMap<String, Integer></string,></string,></string></string>…

immutable コレクション

Google の guava-libraries の 不変(immutable)なコレクション。 普通に HashMap 等を使うほうが簡単だがオブジェクトの状態が変わらないので、 状態に依存しないコレクション操作ができて、状態の変化によるバグを防止できる。 複数のオブジェクトで同じコ…

の関数

Scala の関数は、関数定義として呼び出せる。(Javaのメソッドや C の関数と同様) 名前のない関数として関数リテラルを記述できる。 関数リテラルを値として代入できる。(実行時のオブジェクト(FunctionNのインスタンス)) 関数オブジェクトはFunctionNトレイ…

XMLのスキーマ変換中に発生した ConcurrentModificationException

昨日 trang を使った時に発生した ConcurrentModificationException は いっしょに ダウンロードしたソースファイル(src.zip)を見てみると com/thaiopensource/relaxng/input/xml/Inferrer.java 内にある 下の拡張 for 文(for (Name elementName : outputQue…

XMLスキーマ変換ツール trang を使ってみた。

スキーマの種別は指定する拡張子で判断してくれるようだ。 比較的単純な XML だと問題なくスキーマを作成してくれたが 巨大で複雑な(1500行くらいある)XMLを指定すると、ConcurrentModificationException が発生した。 $ java -jar trang.jar foobar.xml foo…

の配列は、Tuple のように使える

Ruby は配列で、Scala の Tuple のような使い方ができます。 foo, bar, enable = case num when 0; ['bar', 10, 1] when 2; ['foo', 33, 0] when 4; ['run', 14, 0] when 6; ['stop', 25, 1] else; ['etc', 99, 0] end

Tuple を使う

本格的に仕事で Scala を使用することはないのですが、Java のプログラム内で scala の Tuple を使ったりしています。 値を保持するだけのために新規クラスなんかを作成する必要が なくなり結構、便利です。 import scala.Tuple3; .. private Tuple3<String,Integer,Boolean> getData</string,integer,boolean>…