Java Streamで遊ぶ

Streamの大まかな流れ

Stream化 → 中間処理(→中間処理→中間処理→・・) →終端処理

やってみる

public static void main(String[] args) {

        List<Person> persons = new ArrayList<>();
        Person taro = new Person("taro", 20);
        Person jiro = new Person("taro", 22);
        Person saburo = new Person("taro", 19);
        Person siro = new Person("taro", 27);
        Person goro = new Person("taro", 17);
List<Person> persons = Arrays.asList(taro,jiro,saburo,siro,goro);

    }
    

ここまで準備。

Stream化

persons.stream();

年齢の昇順にする

persons.stream()
        .sorted((p1,p2) -> p1.getAge() - p2.getAge())
        .forEach(System.out::println);

成人と未成年でグループ化

Map<Integer, List<Person>> group = 
                persons.stream()
                .collect(Collectors.groupingBy(person -> {
                    if(person.getAge() >= 20) return 1;
                    return 2;
                }));

PersonオブジェクトをStringオブジェクトに変換

persons.stream()
        .map(person -> person.getName())
        .forEach(System.out::println);
        

Javaによる関数型プログラミング ―Java 8ラムダ式とStream

Javaによる関数型プログラミング ―Java 8ラムダ式とStream

Pythonでクイックソート

と、いうわけでPythonクイックソート

def quicksort(array):
    if len(array) < 2:
        return array
    else:
        pivot = array[0]
        #ピボットよりも小さい要素をすべて含んだ部分配列
        less = [i for i in array[1:] if i <= pivot]
        #ピボットよりも大きい要素をすべて含んだ部分配列
        greater = [i for i in array[1:] if i > pivot]
        #配列の要素が0になるまで繰り返す
        return quicksort(less) + [pivot] + quicksort(greater)

array = [2,4,3,5,6,1,8,9,0,11]
print(quicksort(array))

Javaを普段使っているので、[i for i in array[1:] if i > pivot]←これが見慣れないが、 Pythonだとこんな簡単に記述できるんだなぁ。 (リスト内包表記というらしい。)

参考

なっとく!アルゴリズム

なっとく!アルゴリズム

特定のフォルダにある特定の名前から始まるファイルだけを操作する

public static void main(String[] args) {
        //フォルダの指定
        File file = new File("C:\\Users\\User\\test");
        //#listFiles(FileFilter)を使用して特定の名前(test)から始まるファイルだけを操作対象にする
        Arrays.stream(file.listFiles(f -> f.getName().startsWith("test"))).forEach(operateFiles());
    }

    private static Consumer<? super File> operateFiles() {
        return file -> {
            //try-resources文を使用してFileオブジェクトをStream化
            try(Stream<String> lines = Files.lines(Paths.get(file.getPath()))) {
                lines.map(String::toUpperCase).forEach(System.out::println);
            } catch (Exception e) {
                e.printStackTrace();
            }
        };
    }

File#listFilesに渡すFileFilterを変えれば「ファイルの名前にある文字列が含まれる」とかにもできる。