Stream APIとラムダ式

サンプルコード

List<Integer> numberList = List.of(1,2,3,4,5,6,7,8,9,10);
for(Integer number : numberList){
if(number <= 5){
System.out.println(number);
}
}
これは、長すぎるので、最初の部分のforのところにカーソルをあてると左に出る電球のようなマークをクリックすると変更できる候補が出てくる。
そこで、foreachに置換をクリックと画像ではなっているが、
ストリーム’forEach’を含むループを折りたたむをクリックする。

すると
numberList.stream().filter(number -> number <= 5).forEach(System.out::println);


画面通りできた。
ここでの「->」がラムダ式を言われる

このように電球マークの候補を利用してラムダ式に書き換えていくようにすると良い。

解説

  • numberList.stream(). = リストをストリーム化する(リスト変換)
    • ストリーム変換をしている
  • .filter「抽出する」(number -> number <= 5) = 中間処理(if分の代わり、フィルターをかけている。)
    • ループしていく中身の値に対して名前付けをしている。
    • numberが5までならフィルターを通す。
    • ここで1から5までのリストができるという認識。
    • これは「.filter(v -> v <= 5)」とすることが多い。 v=value
  • .forEach(System.out::println); = 終端処理(抽出したものをループさせて表示させる。)


このような一行の処理を「ワンライナー」とよぶ。
しかし、一行では見にくいので改行することがおすすめ。

numberList.stream()
.filter(number -> number <= 5)
.forEach(System.out::println);

マインクラフトへの実装

-- 省略 --
@EventHandler
public void onPlayerBedEnter(PlayerBedEnterEvent e){
e.getPlayer();
}
}
ここまで書いたところで
e.getPlayer();にカーソルをあて、左の電球マークをクリックして、「ローカル変数の導入」をクリックしエンターを押す。

@EventHandler
public void onPlayerBedEnter(PlayerBedEnterEvent e){
Player player = e.getPlayer();
}
}
となる。
これは、option + enter でもできる。

つづいて
@EventHandler
public void onPlayerBedEnter(PlayerBedEnterEvent e){
Player player = e.getPlayer();
player.getInventory()「持ち物、自分の鞄に何を持っているか?」.getContents();
}
}
ここまで書いた時点で
player.getInventory().getContents();にかーそるをあて
option + enterをすると
「ローカル変数の導入」というのが出てくるので、そこをクリックしエンターを押す。

@EventHandler
public void onPlayerBedEnter(PlayerBedEnterEvent e){
Player player = e.getPlayer();
ItemStack[] itemStacks = player.getInventory().getContents();
      (持っているすべてのアイテムを取ってくるという意味)
}
}

つづいて、解説
@EventHandler
public void onPlayerBedEnter(PlayerBedEnterEvent e){
Player player = e.getPlayer();
ItemStack[] itemStacks = player.getInventory().getContents();
for (ItemStack item : itemStacks){
if(item.getMaxStackSize()「同じところに入れられるか」 == 64「マインクラフトでは大体64となっい
        」 && item.getAmount()「所持数」 < 64「64ではない場合」){
item.setAmount(64);「すべて64こ貯まる」
}
}
}
}

「つまり、寝る動作をすれば、重ねることのできる全てのアイテムが、すべてmaxである64になる」
という指示のコード。

そして、前回と同じようにforeachで折りたたむと

@EventHandler
public void onPlayerBedEnter(PlayerBedEnterEvent e){
Player player = e.getPlayer();
ItemStack[] itemStacks = player.getInventory().getContents();
Arrays.stream(itemStacks)
.filter(item -> item.getMaxStackSize() == 64 && item.getAmount() < 64)
.forEach(item -> item.setAmount(64));
}
}

となるが、

itemがない場合は、nullとなってしまってエラーが起きてしまうので、nullのことを考慮しなければいけないので

@EventHandler
public void onPlayerBedEnter(PlayerBedEnterEvent e){
Player player = e.getPlayer();
ItemStack[] itemStacks = player.getInventory().getContents();
for (ItemStack item : itemStacks){
if(!Objects.isNull(item) && item.getMaxStackSize() == 64 && item.getAmount() < 64){
item.setAmount(64);
}
}
}
}
もとのコードに、これを追加
Objects.isNull(item)このhままでは、trueになってしまうので、先頭に「」をつけて反転させる。

そして

@EventHandler
public void onPlayerBedEnter(PlayerBedEnterEvent e){
Player player = e.getPlayer();
ItemStack[] itemStacks = player.getInventory().getContents();
for (ItemStack item : itemStacks){
if(!Objects.isNull(item) && item.getMaxStackSize() == 64 && item.getAmount() < 64){
item.setAmount(64);
}
}

player.getInventory().setContents(itemStacks);
}
}

これを追加して変更した設定を上書きさせる。

そして、ここで再度、foreachで折りたたむと

@EventHandler
public void onPlayerBedEnter(PlayerBedEnterEvent e){
Player player = e.getPlayer();
ItemStack[] itemStacks = player.getInventory().getContents();
Arrays.stream(itemStacks).filter(
item -> !Objects.isNull(item) && item.getMaxStackSize() == 64
&& item.getAmount() < 64).forEach(item -> item.setAmount(64));

player.getInventory().setContents(itemStacks);
}
}
となる。

そして、マインクラフトを実行するとすると

成功!!

検証

filter

条件を満たした値を抽出するメソッド

package plugin.sample2;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import org.bukkit.Bukkit;
import org.bukkit.Color;
import org.bukkit.FireworkEffect;
import org.bukkit.FireworkEffect.Type;
import org.bukkit.World;
import org.bukkit.entity.Firework;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerBedEnterEvent;
import org.bukkit.event.player.PlayerToggleSneakEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.FireworkMeta;
import org.bukkit.plugin.java.JavaPlugin;

public final class Main extends JavaPlugin implements Listener {

private int count;

@Override
public void onEnable() {
Bukkit.getPluginManager().registerEvents(this, this);
}

@EventHandler
public void onPlayerToggleSneak(PlayerToggleSneakEvent e) {
Player player = e.getPlayer();
World world = player.getWorld();

List<String> entitylist = Arrays.asList("Player", "Goat", "Cow");
List<String> filterList = new ArrayList<>();
for (String entity : entitylist) {
if (entity.length() == 3) {
filterList.add(entity);
}
}

// 結果をプレイヤーに表示
player.sendMessage("フィルター結果: " + filterList);

List<Color> colorList = List.of(Color.RED, Color.BLUE, Color.WHITE, Color.BLACK);
if (count % 2 == 0) {
for(Color color : colorList) {
Firework firework = world.spawn(player.getLocation(), Firework.class);
FireworkMeta fireworkMeta = firework.getFireworkMeta();
fireworkMeta.addEffect(
FireworkEffect.builder()
.withColor(color)
.with(Type.STAR)
.withFlicker()
.build());
fireworkMeta.setPower(1);
firework.setFireworkMeta(fireworkMeta);
}
}
count++;
}

@EventHandler
public void onPlayerBedEnter(PlayerBedEnterEvent e){
Player player = e.getPlayer();
ItemStack[] itemStacks = player.getInventory().getContents();
Arrays.stream(itemStacks).filter(
item -> !Objects.isNull(item) && item.getMaxStackSize() == 64
&& item.getAmount() < 64).forEach(item -> item.setAmount(64));

player.getInventory().setContents(itemStacks);
}
}

map to XX

map は 値を変換するメソッドです。map , mapToInt, mapToLongなど様々な型のオブジェクトへ変換

package plugin.sample2;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import org.bukkit.Bukkit;
import org.bukkit.Color;
import org.bukkit.FireworkEffect;
import org.bukkit.FireworkEffect.Type;
import org.bukkit.World;
import org.bukkit.entity.Firework;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerBedEnterEvent;
import org.bukkit.event.player.PlayerToggleSneakEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.FireworkMeta;
import org.bukkit.plugin.java.JavaPlugin;

public final class Main extends JavaPlugin implements Listener {

private int count;

@Override
public void onEnable() {
Bukkit.getPluginManager().registerEvents(this, this);
}

@EventHandler
public void onPlayerToggleSneak(PlayerToggleSneakEvent e) {
Player player = e.getPlayer();
World world = player.getWorld();

List<String> entitylist = Arrays.asList("Player", "Goat", "Cow");
player.sendMessage("元のリスト: " + entitylist);

// entityList の中身を全て大文字へ変換し、プレイヤーに表示
entitylist.stream()
.map(String::toUpperCase)
.forEach(s -> player.sendMessage(s + " "));

List<Color> colorList = List.of(Color.RED, Color.BLUE, Color.WHITE, Color.BLACK);
if (count % 2 == 0) {
for(Color color : colorList) {
Firework firework = world.spawn(player.getLocation(), Firework.class);
FireworkMeta fireworkMeta = firework.getFireworkMeta();
fireworkMeta.addEffect(
FireworkEffect.builder()
.withColor(color)
.with(Type.STAR)
.withFlicker()
.build());
fireworkMeta.setPower(1);
firework.setFireworkMeta(fireworkMeta);
}
}
count++;
}

@EventHandler
public void onPlayerBedEnter(PlayerBedEnterEvent e){
Player player = e.getPlayer();
ItemStack[] itemStacks = player.getInventory().getContents();
Arrays.stream(itemStacks).filter(
item -> !Objects.isNull(item) && item.getMaxStackSize() == 64
&& item.getAmount() < 64).forEach(item -> item.setAmount(64));

player.getInventory().setContents(itemStacks);
}
}

sort

要素をソートするメソッド
数値の場合は昇順、文字列の場合はアルファベット順へ

package plugin.sample2;

import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import org.bukkit.Bukkit;
import org.bukkit.Color;
import org.bukkit.FireworkEffect;
import org.bukkit.FireworkEffect.Type;
import org.bukkit.World;
import org.bukkit.entity.Firework;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerBedEnterEvent;
import org.bukkit.event.player.PlayerToggleSneakEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.FireworkMeta;
import org.bukkit.plugin.java.JavaPlugin;

public final class Main extends JavaPlugin implements Listener {

private int count;

@Override
public void onEnable() {
    Bukkit.getPluginManager().registerEvents(this, this);
}

@EventHandler
public void onPlayerToggleSneak(PlayerToggleSneakEvent e) {
    Player player = e.getPlayer();
    World world = player.getWorld();

    List<String> entitylist = Arrays.asList("Player", "Goat", "Cow");
    player.sendMessage("元のリスト: " + entitylist);

    // entityList をソートして表示
    player.sendMessage("ソート結果:");
    entitylist.stream()
            .sorted()
            .forEach(s -> player.sendMessage(s));

    List<Color> colorList = List.of(Color.RED, Color.BLUE, Color.WHITE, Color.BLACK);
    if (count % 2 == 0) {
        for(Color color : colorList) {
            Firework firework = world.spawn(player.getLocation(), Firework.class);
            FireworkMeta fireworkMeta = firework.getFireworkMeta();
            fireworkMeta.addEffect(
                FireworkEffect.builder()
                    .withColor(color)
                    .with(Type.STAR)
                    .withFlicker()
                    .build());
            fireworkMeta.setPower(1);
            firework.setFireworkMeta(fireworkMeta);
        }
    }
    count++;
}

@EventHandler
public void onPlayerBedEnter(PlayerBedEnterEvent e){
    Player player = e.getPlayer();
    ItemStack[] itemStacks = player.getInventory().getContents();
    Arrays.stream(itemStacks).filter(
        item -> !Objects.isNull(item) && item.getMaxStackSize() == 64
            && item.getAmount() < 64).forEach(item -> item.setAmount(64));

    player.getInventory().setContents(itemStacks);
}
}

limit

指定された個数までに限定するメソッド

package plugin.sample2;

import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import org.bukkit.Bukkit;
import org.bukkit.Color;
import org.bukkit.FireworkEffect;
import org.bukkit.FireworkEffect.Type;
import org.bukkit.World;
import org.bukkit.entity.Firework;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerBedEnterEvent;
import org.bukkit.event.player.PlayerToggleSneakEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.FireworkMeta;
import org.bukkit.plugin.java.JavaPlugin;

public final class Main extends JavaPlugin implements Listener {

private int count;

@Override
public void onEnable() {
    Bukkit.getPluginManager().registerEvents(this, this);
}

@EventHandler
public void onPlayerToggleSneak(PlayerToggleSneakEvent e) {
    Player player = e.getPlayer();
    World world = player.getWorld();

    List<String> entitylist = Arrays.asList("Player", "Goat", "Cow", "Chicken", "Mob");
    player.sendMessage("元のリスト: " + entitylist);

    // 最初の2つの要素のみを表示
    player.sendMessage("最初の2つの要素:");
    entitylist.stream()
            .limit(2)
            .forEach(s -> player.sendMessage(s));

    List<Color> colorList = List.of(Color.RED, Color.BLUE, Color.WHITE, Color.BLACK);
    if (count % 2 == 0) {
        for(Color color : colorList) {
            Firework firework = world.spawn(player.getLocation(), Firework.class);
            FireworkMeta fireworkMeta = firework.getFireworkMeta();
            fireworkMeta.addEffect(
                FireworkEffect.builder()
                    .withColor(color)
                    .with(Type.STAR)
                    .withFlicker()
                    .build());
            fireworkMeta.setPower(1);
            firework.setFireworkMeta(fireworkMeta);
        }
    }
    count++;
}

@EventHandler
public void onPlayerBedEnter(PlayerBedEnterEvent e){
    Player player = e.getPlayer();
    ItemStack[] itemStacks = player.getInventory().getContents();
    Arrays.stream(itemStacks).filter(
        item -> !Objects.isNull(item) && item.getMaxStackSize() == 64
            && item.getAmount() < 64).forEach(item -> item.setAmount(64));

    player.getInventory().setContents(itemStacks);
}
}

distinct

重複した値を取り除くメソッド

package plugin.sample2;

import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import org.bukkit.Bukkit;
import org.bukkit.Color;
import org.bukkit.FireworkEffect;
import org.bukkit.FireworkEffect.Type;
import org.bukkit.World;
import org.bukkit.entity.Firework;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerBedEnterEvent;
import org.bukkit.event.player.PlayerToggleSneakEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.FireworkMeta;
import org.bukkit.plugin.java.JavaPlugin;

public final class Main extends JavaPlugin implements Listener {

private int count;

@Override
public void onEnable() {
    Bukkit.getPluginManager().registerEvents(this, this);
}

@EventHandler
public void onPlayerToggleSneak(PlayerToggleSneakEvent e) {
    Player player = e.getPlayer();
    World world = player.getWorld();

    List<String> entitylist = Arrays.asList("Player", "Player", "Player", "Goat", "Cow");
    player.sendMessage("元のリスト: " + entitylist);

    // 重複を除去して表示
    player.sendMessage("重複除去後の要素:");
    entitylist.stream()
            .distinct()
            .forEach(s -> player.sendMessage(s));

    List<Color> colorList = List.of(Color.RED, Color.BLUE, Color.WHITE, Color.BLACK);
    if (count % 2 == 0) {
        for(Color color : colorList) {
            Firework firework = world.spawn(player.getLocation(), Firework.class);
            FireworkMeta fireworkMeta = firework.getFireworkMeta();
            fireworkMeta.addEffect(
                FireworkEffect.builder()
                    .withColor(color)
                    .with(Type.STAR)
                    .withFlicker()
                    .build());
            fireworkMeta.setPower(1);
            firework.setFireworkMeta(fireworkMeta);
        }
    }
    count++;
}

@EventHandler
public void onPlayerBedEnter(PlayerBedEnterEvent e){
    Player player = e.getPlayer();
    ItemStack[] itemStacks = player.getInventory().getContents();
    Arrays.stream(itemStacks).filter(
        item -> !Objects.isNull(item) && item.getMaxStackSize() == 64
            && item.getAmount() < 64).forEach(item -> item.setAmount(64));

    player.getInventory().setContents(itemStacks);
}
}

collect

あるコレクションを別のコレクションへ変換する際に便利な集約処理を行うメソッド

package plugin.sample2;

import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import org.bukkit.Bukkit;
import org.bukkit.Color;
import org.bukkit.FireworkEffect;
import org.bukkit.FireworkEffect.Type;
import org.bukkit.World;
import org.bukkit.entity.Firework;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerBedEnterEvent;
import org.bukkit.event.player.PlayerToggleSneakEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.FireworkMeta;
import org.bukkit.plugin.java.JavaPlugin;

public final class Main extends JavaPlugin implements Listener {

private int count;

@Override
public void onEnable() {
    Bukkit.getPluginManager().registerEvents(this, this);
}

@EventHandler
public void onPlayerToggleSneak(PlayerToggleSneakEvent e) {
    Player player = e.getPlayer();
    World world = player.getWorld();

    List<String> entitylist = Arrays.asList("Player", "Goat", "Cow", "Chicken", "Mob");
    player.sendMessage("元のリスト: " + entitylist);

    // 文字列を大文字に変換し、「,」で連結して表示
    String result = entitylist.stream()
            .map(String::toUpperCase)
            .collect(Collectors.joining(", "));
    player.sendMessage("変換結果: " + result);

    List<Color> colorList = List.of(Color.RED, Color.BLUE, Color.WHITE, Color.BLACK);
    if (count % 2 == 0) {
        for(Color color : colorList) {
            Firework firework = world.spawn(player.getLocation(), Firework.class);
            FireworkMeta fireworkMeta = firework.getFireworkMeta();
            fireworkMeta.addEffect(
                FireworkEffect.builder()
                    .withColor(color)
                    .with(Type.STAR)
                    .withFlicker()
                    .build());
            fireworkMeta.setPower(1);
            firework.setFireworkMeta(fireworkMeta);
        }
    }
    count++;
}

@EventHandler
public void onPlayerBedEnter(PlayerBedEnterEvent e){
    Player player = e.getPlayer();
    ItemStack[] itemStacks = player.getInventory().getContents();
    Arrays.stream(itemStacks).filter(
        item -> !Objects.isNull(item) && item.getMaxStackSize() == 64
            && item.getAmount() < 64).forEach(item -> item.setAmount(64));

    player.getInventory().setContents(itemStacks);
}
}

toArray 

配列に変換するメソッド

package plugin.sample2;

import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import org.bukkit.Bukkit;
import org.bukkit.Color;
import org.bukkit.FireworkEffect;
import org.bukkit.FireworkEffect.Type;
import org.bukkit.World;
import org.bukkit.entity.Firework;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerBedEnterEvent;
import org.bukkit.event.player.PlayerToggleSneakEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.FireworkMeta;
import org.bukkit.plugin.java.JavaPlugin;

public final class Main extends JavaPlugin implements Listener {

private int count;

@Override
public void onEnable() {
    Bukkit.getPluginManager().registerEvents(this, this);
}

@EventHandler
public void onPlayerToggleSneak(PlayerToggleSneakEvent e) {
    Player player = e.getPlayer();
    World world = player.getWorld();

    List<String> entitylist = Arrays.asList("Player", "Goat", "Cow", "Chicken", "Mob");
    player.sendMessage("元のリスト: " + entitylist);

    // 文字列を大文字に変換し、配列に変換して表示
    String[] entityArray = entitylist.stream()
        .map(String::toUpperCase)
        .toArray(String[]::new);
    player.sendMessage("変換結果: " + Arrays.toString(entityArray));

    List<Color> colorList = List.of(Color.RED, Color.BLUE, Color.WHITE, Color.BLACK);
    if (count % 2 == 0) {
        for(Color color : colorList) {
            Firework firework = world.spawn(player.getLocation(), Firework.class);
            FireworkMeta fireworkMeta = firework.getFireworkMeta();
            fireworkMeta.addEffect(
                FireworkEffect.builder()
                    .withColor(color)
                    .with(Type.STAR)
                    .withFlicker()
                    .build());
            fireworkMeta.setPower(1);
            firework.setFireworkMeta(fireworkMeta);
        }
    }
    count++;
}

@EventHandler
public void onPlayerBedEnter(PlayerBedEnterEvent e){
    Player player = e.getPlayer();
    ItemStack[] itemStacks = player.getInventory().getContents();
    Arrays.stream(itemStacks).filter(
        item -> !Objects.isNull(item) && item.getMaxStackSize() == 64
            && item.getAmount() < 64).forEach(item -> item.setAmount(64));

    player.getInventory().setContents(itemStacks);
}
}

count

要素数を返却するメソッド

package plugin.sample2;

import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import org.bukkit.Bukkit;
import org.bukkit.Color;
import org.bukkit.FireworkEffect;
import org.bukkit.FireworkEffect.Type;
import org.bukkit.World;
import org.bukkit.entity.Firework;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerBedEnterEvent;
import org.bukkit.event.player.PlayerToggleSneakEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.FireworkMeta;
import org.bukkit.plugin.java.JavaPlugin;

public final class Main extends JavaPlugin implements Listener {

private int count;

@Override
public void onEnable() {
    Bukkit.getPluginManager().registerEvents(this, this);
}

@EventHandler
public void onPlayerToggleSneak(PlayerToggleSneakEvent e) {
    Player player = e.getPlayer();
    World world = player.getWorld();

    List<String> entitylist = Arrays.asList("Player", "Goat", "Cow", "Chicken", "Mob");
    player.sendMessage("元のリスト: " + entitylist);

    // リストの要素数をカウントして表示
    long elementCount = entitylist.stream().count();
    player.sendMessage("リストの要素数: " + elementCount);

    List<Color> colorList = List.of(Color.RED, Color.BLUE, Color.WHITE, Color.BLACK);
    if (count % 2 == 0) {
        for(Color color : colorList) {
            Firework firework = world.spawn(player.getLocation(), Firework.class);
            FireworkMeta fireworkMeta = firework.getFireworkMeta();
            fireworkMeta.addEffect(
                FireworkEffect.builder()
                    .withColor(color)
                    .with(Type.STAR)
                    .withFlicker()
                    .build());
            fireworkMeta.setPower(1);
            firework.setFireworkMeta(fireworkMeta);
        }
    }
    count++;
}

@EventHandler
public void onPlayerBedEnter(PlayerBedEnterEvent e){
    Player player = e.getPlayer();
    ItemStack[] itemStacks = player.getInventory().getContents();
    Arrays.stream(itemStacks).filter(
        item -> !Objects.isNull(item) && item.getMaxStackSize() == 64
            && item.getAmount() < 64).forEach(item -> item.setAmount(64));

    player.getInventory().setContents(itemStacks);
}
}

max / min

最大値 / 最小値を返すメソッド

package plugin.sample2;

import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import org.bukkit.Bukkit;
import org.bukkit.Color;
import org.bukkit.FireworkEffect;
import org.bukkit.FireworkEffect.Type;
import org.bukkit.World;
import org.bukkit.entity.Firework;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerBedEnterEvent;
import org.bukkit.event.player.PlayerToggleSneakEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.FireworkMeta;
import org.bukkit.plugin.java.JavaPlugin;

public final class Main extends JavaPlugin implements Listener {

private int count;

@Override
public void onEnable() {
    Bukkit.getPluginManager().registerEvents(this, this);
}

@EventHandler
public void onPlayerToggleSneak(PlayerToggleSneakEvent e) {
    Player player = e.getPlayer();
    World world = player.getWorld();

    List<String> entitylist = Arrays.asList("Player", "Goat", "Cow", "Chicken", "Mob");
    player.sendMessage("元のリスト: " + entitylist);

    // 文字列の長さが最小のentityを出力
    Optional<String> minLengthEntity = entitylist.stream().min((s, t) -> s.length() - t.length());
    player.sendMessage("最短の文字列: " + minLengthEntity);

    // 文字列の長さが最大のentityを出力
    Optional<String> maxLengthEntity = entitylist.stream().max((s, t) -> s.length() - t.length());
    player.sendMessage("最長の文字列: " + maxLengthEntity);

    List<Color> colorList = List.of(Color.RED, Color.BLUE, Color.WHITE, Color.BLACK);
    if (count % 2 == 0) {
        for(Color color : colorList) {
            Firework firework = world.spawn(player.getLocation(), Firework.class);
            FireworkMeta fireworkMeta = firework.getFireworkMeta();
            fireworkMeta.addEffect(
                FireworkEffect.builder()
                    .withColor(color)
                    .with(Type.STAR)
                    .withFlicker()
                    .build());
            fireworkMeta.setPower(1);
            firework.setFireworkMeta(fireworkMeta);
        }
    }
    count++;
}

@EventHandler
public void onPlayerBedEnter(PlayerBedEnterEvent e){
    Player player = e.getPlayer();
    ItemStack[] itemStacks = player.getInventory().getContents();
    Arrays.stream(itemStacks).filter(
        item -> !Objects.isNull(item) && item.getMaxStackSize() == 64
            && item.getAmount() < 64).forEach(item -> item.setAmount(64));

    player.getInventory().setContents(itemStacks);
}
}

sum

合計値を返すメソッド

package plugin.sample2;

import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import org.bukkit.Bukkit;
import org.bukkit.Color;
import org.bukkit.FireworkEffect;
import org.bukkit.FireworkEffect.Type;
import org.bukkit.World;
import org.bukkit.entity.Firework;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerBedEnterEvent;
import org.bukkit.event.player.PlayerToggleSneakEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.FireworkMeta;
import org.bukkit.plugin.java.JavaPlugin;

public final class Main extends JavaPlugin implements Listener {

private int count;

@Override
public void onEnable() {
    Bukkit.getPluginManager().registerEvents(this, this);
}

@EventHandler
public void onPlayerToggleSneak(PlayerToggleSneakEvent e) {
    Player player = e.getPlayer();
    World world = player.getWorld();

    List<String> entitylist = Arrays.asList("Player", "Goat", "Cow", "Chicken", "Mob");
    player.sendMessage("元のリスト: " + entitylist);

    // 文字列の長さの合計を算出
    int totalLength = entitylist.stream().mapToInt(String::length).sum();
    player.sendMessage("文字列の長さの合計: " + totalLength);

    List<Color> colorList = List.of(Color.RED, Color.BLUE, Color.WHITE, Color.BLACK);
    if (count % 2 == 0) {
        for(Color color : colorList) {
            Firework firework = world.spawn(player.getLocation(), Firework.class);
            FireworkMeta fireworkMeta = firework.getFireworkMeta();
            fireworkMeta.addEffect(
                FireworkEffect.builder()
                    .withColor(color)
                    .with(Type.STAR)
                    .withFlicker()
                    .build());
            fireworkMeta.setPower(1);
            firework.setFireworkMeta(fireworkMeta);
        }
    }
    count++;
}

@EventHandler
public void onPlayerBedEnter(PlayerBedEnterEvent e){
    Player player = e.getPlayer();
    ItemStack[] itemStacks = player.getInventory().getContents();
    Arrays.stream(itemStacks).filter(
        item -> !Objects.isNull(item) && item.getMaxStackSize() == 64
            && item.getAmount() < 64).forEach(item -> item.setAmount(64));

    player.getInventory().setContents(itemStacks);
}
}

findfirst

先頭の値を返すメソッド

package plugin.sample2;

import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import org.bukkit.Bukkit;
import org.bukkit.Color;
import org.bukkit.FireworkEffect;
import org.bukkit.FireworkEffect.Type;
import org.bukkit.World;
import org.bukkit.entity.Firework;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerBedEnterEvent;
import org.bukkit.event.player.PlayerToggleSneakEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.FireworkMeta;
import org.bukkit.plugin.java.JavaPlugin;

public final class Main extends JavaPlugin implements Listener {

private int count;

@Override
public void onEnable() {
    Bukkit.getPluginManager().registerEvents(this, this);
}

@EventHandler
public void onPlayerToggleSneak(PlayerToggleSneakEvent e) {
    Player player = e.getPlayer();
    World world = player.getWorld();

    // 新しいコードの動作確認
    List<String> entitylist = Arrays.asList("Player", "Goat", "Cow", "Chicken", "Mob");
    player.sendMessage("元のリスト: " + entitylist);

    // C から始まる最初のEntitiyを出力
    Optional<String> foundEntity = entitylist.stream()
            .filter(entity -> entity.startsWith("C"))
            .findFirst();
    player.sendMessage("C から始まる最初のEntity: " + foundEntity);

    List<Color> colorList = List.of(Color.RED, Color.BLUE, Color.WHITE, Color.BLACK);
    if (count % 2 == 0) {
        for(Color color : colorList) {
            Firework firework = world.spawn(player.getLocation(), Firework.class);
            FireworkMeta fireworkMeta = firework.getFireworkMeta();
            fireworkMeta.addEffect(
                FireworkEffect.builder()
                    .withColor(color)
                    .with(Type.STAR)
                    .withFlicker()
                    .build());
            fireworkMeta.setPower(1);
            firework.setFireworkMeta(fireworkMeta);
        }
    }
    count++;
}

@EventHandler
public void onPlayerBedEnter(PlayerBedEnterEvent e){
    Player player = e.getPlayer();
    ItemStack[] itemStacks = player.getInventory().getContents();
    Arrays.stream(itemStacks).filter(
        item -> !Objects.isNull(item) && item.getMaxStackSize() == 64
            && item.getAmount() < 64).forEach(item -> item.setAmount(64));

    player.getInventory().setContents(itemStacks);
}
}

anyMatch

1つでも条件に合致する値があるか確認するメソッド
合致する値があれば true を返す。

package plugin.sample2;

import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import org.bukkit.Bukkit;
import org.bukkit.Color;
import org.bukkit.FireworkEffect;
import org.bukkit.FireworkEffect.Type;
import org.bukkit.World;
import org.bukkit.entity.Firework;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerBedEnterEvent;
import org.bukkit.event.player.PlayerToggleSneakEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.FireworkMeta;
import org.bukkit.plugin.java.JavaPlugin;

public final class Main extends JavaPlugin implements Listener {

private int count;

@Override
public void onEnable() {
    Bukkit.getPluginManager().registerEvents(this, this);
}

@EventHandler
public void onPlayerToggleSneak(PlayerToggleSneakEvent e) {
    Player player = e.getPlayer();
    World world = player.getWorld();

    List<String> entitylist = Arrays.asList("Player", "Goat", "Cow", "Chicken", "Mob");
    player.sendMessage("元のリスト: " + entitylist);

    // Cから始まる Entity が1つでもあるかチェック
    boolean hasCEntity = entitylist.stream().anyMatch(entity -> entity.startsWith("C"));
    player.sendMessage("Cから始まる Entity が存在するか: " + hasCEntity);

    List<Color> colorList = List.of(Color.RED, Color.BLUE, Color.WHITE, Color.BLACK);
    if (count % 2 == 0) {
        for(Color color : colorList) {
            Firework firework = world.spawn(player.getLocation(), Firework.class);
            FireworkMeta fireworkMeta = firework.getFireworkMeta();
            fireworkMeta.addEffect(
                FireworkEffect.builder()
                    .withColor(color)
                    .with(Type.STAR)
                    .withFlicker()
                    .build());
            fireworkMeta.setPower(1);
            firework.setFireworkMeta(fireworkMeta);
        }
    }
    count++;
}

@EventHandler
public void onPlayerBedEnter(PlayerBedEnterEvent e){
    Player player = e.getPlayer();
    ItemStack[] itemStacks = player.getInventory().getContents();
    Arrays.stream(itemStacks).filter(
        item -> !Objects.isNull(item) && item.getMaxStackSize() == 64
            && item.getAmount() < 64).forEach(item -> item.setAmount(64));

    player.getInventory().setContents(itemStacks);
}
}

allMatch

全ての値が条件に合致するか確認するメソッド
合致すれば true を返す。

package plugin.sample2;

import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import org.bukkit.Bukkit;
import org.bukkit.Color;
import org.bukkit.FireworkEffect;
import org.bukkit.FireworkEffect.Type;
import org.bukkit.World;
import org.bukkit.entity.Firework;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerBedEnterEvent;
import org.bukkit.event.player.PlayerToggleSneakEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.FireworkMeta;
import org.bukkit.plugin.java.JavaPlugin;

public final class Main extends JavaPlugin implements Listener {

private int count;

@Override
public void onEnable() {
    Bukkit.getPluginManager().registerEvents(this, this);
}

@EventHandler
public void onPlayerToggleSneak(PlayerToggleSneakEvent e) {
    Player player = e.getPlayer();
    World world = player.getWorld();

    List<String> entitylist = Arrays.asList("Player", "Goat", "Cow", "Chicken", "Mob");
    player.sendMessage("元のリスト: " + entitylist);

    // 全てのEntityが C から始まるかチェック
    boolean allStartWithC = entitylist.stream().allMatch(entity -> entity.startsWith("C"));
    player.sendMessage("全てのEntityが C から始まるか: " + allStartWithC);

    List<Color> colorList = List.of(Color.RED, Color.BLUE, Color.WHITE, Color.BLACK);
    if (count % 2 == 0) {
        for(Color color : colorList) {
            Firework firework = world.spawn(player.getLocation(), Firework.class);
            FireworkMeta fireworkMeta = firework.getFireworkMeta();
            fireworkMeta.addEffect(
                FireworkEffect.builder()
                    .withColor(color)
                    .with(Type.STAR)
                    .withFlicker()
                    .build());
            fireworkMeta.setPower(1);
            firework.setFireworkMeta(fireworkMeta);
        }
    }
    count++;
}

@EventHandler
public void onPlayerBedEnter(PlayerBedEnterEvent e){
    Player player = e.getPlayer();
    ItemStack[] itemStacks = player.getInventory().getContents();
    Arrays.stream(itemStacks).filter(
        item -> !Objects.isNull(item) && item.getMaxStackSize() == 64
            && item.getAmount() < 64).forEach(item -> item.setAmount(64));

    player.getInventory().setContents(itemStacks);
}
}

foreach

コレクションの要素を要素ごとに繰り返し処理
処理内容は forEach() の引数ないに指定

package plugin.sample2;

import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import org.bukkit.Bukkit;
import org.bukkit.Color;
import org.bukkit.FireworkEffect;
import org.bukkit.FireworkEffect.Type;
import org.bukkit.World;
import org.bukkit.entity.Firework;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerBedEnterEvent;
import org.bukkit.event.player.PlayerToggleSneakEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.FireworkMeta;
import org.bukkit.plugin.java.JavaPlugin;

public final class Main extends JavaPlugin implements Listener {

private int count;

@Override
public void onEnable() {
    Bukkit.getPluginManager().registerEvents(this, this);
}

@EventHandler
public void onPlayerToggleSneak(PlayerToggleSneakEvent e) {
    Player player = e.getPlayer();
    World world = player.getWorld();

    List<String> entitylist = Arrays.asList("Player", "Goat", "Cow", "Chicken", "Mob");
    player.sendMessage("元のリスト: " + entitylist);

    player.sendMessage("5文字より長い最初の2つのEntity:");
    entitylist.stream()
        .filter(s -> s.length() > 5)
        .limit(2)
        .forEach(player::sendMessage);

    List<Color> colorList = List.of(Color.RED, Color.BLUE, Color.WHITE, Color.BLACK);
    if (count % 2 == 0) {
        for(Color color : colorList) {
            Firework firework = world.spawn(player.getLocation(), Firework.class);
            FireworkMeta fireworkMeta = firework.getFireworkMeta();
            fireworkMeta.addEffect(
                FireworkEffect.builder()
                    .withColor(color)
                    .with(Type.STAR)
                    .withFlicker()
                    .build());
            fireworkMeta.setPower(1);
            firework.setFireworkMeta(fireworkMeta);
        }
    }
    count++;
}

@EventHandler
public void onPlayerBedEnter(PlayerBedEnterEvent e){
    Player player = e.getPlayer();
    ItemStack[] itemStacks = player.getInventory().getContents();
    Arrays.stream(itemStacks).filter(
        item -> !Objects.isNull(item) && item.getMaxStackSize() == 64
            && item.getAmount() < 64).forEach(item -> item.setAmount(64));

    player.getInventory().setContents(itemStacks);
}
}

課題

スタック数がMaxじゃないものは消えるようにする

package plugin.sample2;

import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import org.bukkit.Bukkit;
import org.bukkit.Color;
import org.bukkit.FireworkEffect;
import org.bukkit.FireworkEffect.Type;
import org.bukkit.World;
import org.bukkit.entity.Firework;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerBedEnterEvent;
import org.bukkit.event.player.PlayerToggleSneakEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.FireworkMeta;
import org.bukkit.plugin.java.JavaPlugin;

public final class Main extends JavaPlugin implements Listener {

private int count;

@Override
public void onEnable() {
Bukkit.getPluginManager().registerEvents(this, this);
}

/**
* プレイヤーがスニークを開始/終了する際に起動されるイベントハンドラ。
*
* @param e イベント
*/
@EventHandler
public void onPlayerToggleSneak(PlayerToggleSneakEvent e) {
// イベント発生時のプレイヤーやワールドなどの情報を変数に持つ。
Player player = e.getPlayer();
World world = player.getWorld();

List<Color> colorList = List.of(Color.RED, Color.BLUE, Color.WHITE, Color.BLACK );
if (count % 2 == 0) {
for(Color color : colorList) {
// // 花火オブジェクトをプレイヤーのロケーション地点に対して出現させる。
Firework firework = world.spawn(player.getLocation(), Firework.class);

// 花火オブジェクトが持つメタ情報を取得。
FireworkMeta fireworkMeta = firework.getFireworkMeta();

// メタ情報に対して設定を追加したり、値の上書きを行う。
// 今回は青色で星型の花火を打ち上げる。
fireworkMeta.addEffect(
FireworkEffect.builder()
.withColor(color)
.with(Type.STAR)
.withFlicker()
.build());
fireworkMeta.setPower(1);

// 追加した情報で再設定する。
firework.setFireworkMeta(fireworkMeta);
}
}
count ++;
}

@EventHandler
public void onPlayerBedEnter(PlayerBedEnterEvent e){
Player player = e.getPlayer();
ItemStack[] itemStacks = player.getInventory().getContents();
Arrays.stream(itemStacks).filter(
item -> !Objects.isNull(item) && item.getMaxStackSize() == 64
&& item.getAmount() < 64).forEach(item -> item.setAmount(0));

player.getInventory().setContents(itemStacks);
}
}

成功!!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次