Lambdaはdemoを簡単に使います

2413 ワード

Lambdaの個人的な理解:
1.lambdaは入力コードを簡略化したが、簡略化しなかった
2.lambdaは一般的にRunnable,Consumer,Predicateなどの抽象的な方法しかないインタフェースの匿名クラスの作成を用いる
 
package main.test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.function.Predicate;

import org.junit.jupiter.api.Test;

public class FunctionTest {

	/**
	 * lambda expression test
	 * summary: lambda is anonymous method , used to replace interface class with one abstract method.
	 * @see https://www.cnblogs.com/franson-2016/p/5593080.html
	 */
	@Test
	public void lambdaTest() {
		String[] names = { "zhang san", "li si", "wang wu" };
		List nameList = Arrays.asList(names);

		// case one: traversal List
		// replace anonymous inner class
		nameList.forEach(new Consumer() {
			@Override
			public void accept(String t) {
				System.out.println(t);
			}
		});

		// by lamdda style : name is parameter, -> is "gose to" ,
		// System.out.println(name) is action
		nameList.forEach((name) -> System.out.println(name));

		// case two: set domain
		List staffs = new ArrayList();
		/*nameList.forEach(new Consumer() {
			@Override
			public void accept(String name) {
				Staff s = new Staff();
				s.setName(name);
				s.setSalary(1000d + name.charAt(0));
				staffs.add(s);
			}
		});*/

		nameList.forEach((name) -> {
			staffs.add(new Staff(name,1000d + name.charAt(0)));
		});

		// filter salary more then 1119
		Predicate salaryFilter = (p) -> p.salary > 1119d;
		
		Optional findFirst = staffs.stream().filter(salaryFilter).findFirst();
		if(findFirst.isPresent()) {
			System.out.println(findFirst.get().toString());
		}

	}

	class Staff {
		private String name;
		private Double salary;
		
		Staff(){}
		
		Staff(String name, Double salary){
			this.name = name;
			this.salary = salary;
		}
		public String getName() {
			return name;
		}

		public void setName(String name) {
			this.name = name;
		}

		public Double getSalary() {
			return salary;
		}

		public void setSalary(Double salary) {
			this.salary = salary;
		}

		@Override
		public String toString() {
			return "Staff [name=" + name + ", salary=" + salary + "]";
		}
	}
}