사용할 데이터

package javabasic.stream;

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

public class FuncEx01 {
	static class User{
		final Long id;
		final String name;
		final Integer age;
		
		public User(Long id, String name, Integer age) {
			this.id = id;
			this.name = name;
			this.age = age;
		}
	}
	
	static List<User> getUsers(){
		return Arrays.asList( 
				new User(10L, "ID", 36),
				new User(20L, "BJ", 32),
				new User(30L, "JM", 32),
				new User(40L, "PJ", 27),
				new User(50L, "HA", 25),
				new User(60L, "JE", 26),
				new User(70L, "JI", 31),
				new User(80L, "MP", 23)
				);
	}
	
	
	public static void main(String[] args) {
	}
}
	public static void main(String[] args) {
		List<User> users = getUsers();
		
		System.out.println(
				filter(users,user->user.age>30)+"\n"
				+users
				);
		
		
	}
    static <T> List<T> filter(List<T> list, Predicate<T> predi) {
		//함수형 프로그래밍은 원본 데이터를 수정하지 않는다. 새로운 데이터를 리턴하여
		//부수효과를 극단적으로 배제한다.
		ArrayList<T> newList = new ArrayList<>();
		for(T data : list) {
			//자바는 근본적으로 함수단독으로 존재할 수 없다.
			//따라서 추상 메서드가 단 하나인 인터페이스를 사용해 메서드 형식으로 호출할 수 밖에 없다.
			if(predi.test(data))
				newList.add(data);
		}
		return newList;
	}
filter = [[id=10, name=ID, age=36]
, [id=20, name=BJ, age=32]
, [id=30, name=JM, age=32]
, [id=70, name=JI, age=31]
]
[[id=10, name=ID, age=36]
, [id=20, name=BJ, age=32]
, [id=30, name=JM, age=32]
, [id=40, name=PJ, age=27]
, [id=50, name=HA, age=25]
, [id=60, name=JE, age=26]
, [id=70, name=JI, age=31]
, [id=80, name=MP, age=23]
]

원본에 영향을 가지 않도록 처리했다.

Map

	/*
	 * map은 처리 결과가 입력 결과와 타입은 같거나 다르다.
	 * 길이는 항상 같다.
	 */
	static <T,R> List<R> map(List<T> list, Function<T, R> mapper){
		ArrayList<R> newList = new ArrayList<>();
		for(T data : list) 
			newList.add(mapper.apply(data));
		return newList;
	}
		System.out.println("map = "+
				map(users, user->user.id)
				);
map = [10, 20, 30, 40, 50, 60, 70, 80]

each 만든 후 filter, map에 적용

전체 코드

package javabasic.stream;

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

public class FuncEx01 {
	static class User{
		final Long id;
		final String name;
		final Integer age;
		
		public User(Long id, String name, Integer age) {
			this.id = id;
			this.name = name;
			this.age = age;
		}

		@Override
		public String toString() {
			return "[id=" + id + ", name=" + name + ", age=" + age + "]\n";
		}
		
	}
	
	static List<User> getUsers(){
		return Arrays.asList( 
				new User(10L, "ID", 36),
				new User(20L, "BJ", 32),
				new User(30L, "JM", 32),
				new User(40L, "PJ", 27),
				new User(50L, "HA", 25),
				new User(60L, "JE", 26),
				new User(70L, "JI", 31),
				new User(80L, "MP", 23)
				);
	}
	
	
	public static void main(String[] args) {
		List<User> users = getUsers();
		
		System.out.println("filter = "+
				filter(users,user->user.age>30)+"\n"
				+users
				);
		
		System.out.println("map = "+
				map(users, user->user.id)
				);
		
		each(Arrays.asList(1,2,3,4,5),System.out::print);
		System.out.println();
		
	}
	/*
	 * filter는 처리 결과가 입력 결과와 타입은 같다.
	 * 길이는 같거나, 작을 수 밖에 없다.
	 */
	static <T> List<T> filter(List<T> list, Predicate<T> predi) {
		//함수형 프로그래밍은 원본 데이터를 수정하지 않는다. 새로운 데이터를 리턴하여
		//부수효과를 극단적으로 배제한다.
		ArrayList<T> newList = new ArrayList<>();
		each(list,data->{
			if(predi.test(data))
				newList.add(data);
		});
		
		return newList;
	}
	/*
	 * map은 처리 결과가 입력 결과와 타입은 같거나 다르다.
	 * 길이는 항상 같다.
	 */
	static <T,R> List<R> map(List<T> list, Function<T, R> mapper){
		ArrayList<R> newList = new ArrayList<>();
		each(list, data->{
			newList.add(mapper.apply(data));
		});
		return newList;
	}
	/*
	 * 반복문을 중복을 대체할 함수
	 */
	static <T> List<T> each(List<T> list, Consumer<T> iter){
		for(T data : list) 
			iter.accept(data);
		return list;
	}
	
}

 

1996년 출시한 객체지향 프로그래밍 언어

 

자바의 특징

  • 운영체제에 독립적이다.
    JVM만 설치되면 된다. JVM은 거의 모든 운영체제별로 준비가 되어있다.
    따라서 하나의 코드로 모든 환경에서 사용이 가능하다.

  • 객체지향언어이다.
    코드의 재사용성, 유지보수가 편리하다
  • 자동 메모리 관리
    메모리를 관리해주는 가비지 컬렉터가 존재해 개발자는 메모리 관리에 힘을 쓰지 않고 개발에만 집중할 수 있다.
  • 네트워크와 분산처리를 지원한다.
  • 멀티쓰레드를 지원한다.
    멀티쓰레드는 운영체제에 따라 구현 방법도 상이하고, 처리방법도 다르지만 자바는 멀티쓰레드 관련 API를 제공한다.
    따라서 사용법만 알면 손쉽게 구현이 가능하다
  • 동적로딩을 지원한다.
    애플리케이션 실행 시 모든 클래스가 로딩되지 않고 필요한 시점에 로딩할 수 있다.

JVM(Java Virtual Machine)

모든 자바 코드를 실행하기 위한 프로그램

자바와 일반 소프트웨어 차이

  • 단점
    일반 애플리케이션은 OS 거치고 컴퓨터로 코드 전달따라서 속도가 느리다.
    하지만 극복을 위해 요즘엔 바이트코드(컴파일된 자바코드) 하드웨어의 기계어로 바로 변환해주는 JIT컴파일러와 향상된 최적화 기술이 적용되어서 속도 격차를 많이 줄였다.
  • 장점
    하나의 코드로 모든 플랫폼에서 실행이 가능하다.

'개발 > 자바(JAVA)' 카테고리의 다른 글

파일 옮기기  (0) 2022.07.25
변수의 타입  (0) 2022.07.07
변수  (0) 2022.07.03
폴더, 파일 수 탐색  (0) 2022.05.27
File  (0) 2022.05.26

+ Recent posts