데이터를 ListMap에 넣어 사용하면서 필요한 내용만 골라서 사용해야 하는 경우 Loop를 돌리는 방법도 있지만 stream을 이용하면 쉽게 필터링이 가능 합니다.

 

stream을 이용하기 때문에 리턴값이 stream으로 넘어오지만 collect를 사용하여 필요한 형태로 가공하여 받아올 수도 있습니다.

 

 

 

 

먼저 List에 있는 데이터를 필터링 하는 방법입니다.

 

        List<String> list = new ArrayList<>();
        list.add("test");
        list.add("atest");
        list.add("test1");
        list.add("btest");
        list.add("ctest");
        list.add("test2");
        list.add("dtest");
        list.add("etest");
       
        Stream<String> filter = list.stream().filter(l->l.startsWith("t"));
        filter.forEach(System.out::println);
 
        List<String> lst = list.stream().filter(l->l.startsWith("t"))
                       .collect(Collectors.toList());
        System.out.println("List : " + lst);

 

첫번째 system.outstream으로 받아온 예제이고

두번째는 collect를 이용하여 다시 List로 받아오는 내용입니다.

 

첫번째 결과는

test
test1
test2

 

두번째는

 

List : [test, test1, test2]

 

 

다음은 Map<String, String>을 필터링 하는 방법입니다.

 

Map<String, String> map = new HashMap<>();
              
map.put("aa", "ba");
map.put("baa", "abb");
map.put("abb", "bbb");
map.put("caa", "acc");
map.put("aac", "aac");
map.put("aad", "cad");
              
Map<String, String> filterMap = map.entrySet()
        .stream().filter(f->f.getKey().startsWith("a"))
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
System.out.println("key : " + filterMap);
              
Map<String, String> filterVal = map.entrySet()
        .stream().filter(f->f.getValue().startsWith("a"))
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
System.out.println("value : " + filterVal);
              
Map<String, String> conMap = map.entrySet()
        .stream().filter(f->f.getKey().contains("a"))
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
System.out.println("contain : " + conMap);

 

첫번째는 key 값이 “a”로 시작하는 내용만 필터링하고

두번째는 value 값이 “a”로 시작하는 내용만 필터링하고

세번째는 key 값에 “a”가 들어있는 내용만 필터링하는 예제 입니다.

 

각각의 결과는

 

key : {aa=ba, abb=bbb, aac=aac, aad=cad}
value : {caa=acc, aac=aac, baa=abb}
contain : {aa=ba, abb=bbb, caa=acc, aac=aac, baa=abb, aad=cad}

 

 

이번에는 Map<Integer, String>을 필터링 하는 방법입니다.

 

Map<Integer, String> intMap = new HashMap<>();
              
intMap.put(10, "ba");
intMap.put(20, "abb");
intMap.put(30, "bbb");
intMap.put(40, "acc");
intMap.put(50, "aac");
intMap.put(60, "cad");
              
Map<Integer, String> intFilter = intMap.entrySet()
        .stream().filter(x->x.getKey() > 30)
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
System.out.println("intMap : " + intFilter);
              
              
Map<Integer, String> intMap2 = new HashMap<>();
for(Map.Entry<Integer, String> intmap : intMap.entrySet()) {
        if(intmap.getKey() > 30)
               intMap2.put(intmap.getKey(), intmap.getValue());
}
System.out.println("intMap : " + intMap2);

 

key 값이 숫자인 경우 조건식으로 필터링 하는 방법입니다.

결과는 동일한데 추출하는 방법을 하나는 for문을 사용해 봤습니다.

 

intMap : {50=aac, 40=acc, 60=cad}
intMap : {50=aac, 40=acc, 60=cad}

 - copy coding -

 

html tag를 데이터베이스에 저장하기위해 특수문자를 변환해야 하는 경우가 발생합니다.  DB에 저장을 했으니 웹 페이지에 뿌릴때는 반대의 작업을 해야 하는데 이때 Spring을 사용한다면 특별히 라이브러리를 설치하지 않고도 변환이 가능합니다.

 

간단한 예제를 살펴 보면

import org.springframework.web.util.HtmlUtils;
 
        String tag ="<HTML> <table><tr><div> &";
        String esc = HtmlUtils.htmlEscape(tag);
        String uesc = HtmlUtils.htmlUnescape(esc);
 
        System.out.println("escape : " + esc);
        System.out.println("uescape : " + uesc);

 

이렇게 "<HTML> <table><tr><div> &” HTML 문서가 있는 경우 htmlEscape htmlUnescape 함수를 이용하면

 

escape : &lt;HTML&gt; &lt;table&gt;&lt;tr&gt;&lt;div&gt; &amp;
uescape : <HTML> <table><tr><div> &

 

이렇게 쉽게 변환이 가능 합니다.

 

만약 일반적인 특수 기호나 숫자, 알파벳을 변환하려고 하면 어떻게 될까요?

 

        String sTag = "( ) \\ [ ] { } ! @ $ % ^ * 1 2 3 A B C";
        String sEsc = HtmlUtils.htmlEscape(sTag);
        String sUesc = HtmlUtils.htmlUnescape(sEsc);
       
        System.out.println("escape : " + sEsc);
        System.out.println("uescape : " + sUesc);

 

escape : ( ) \ [ ] { } ! @ $ % ^ * 1 2 3 A B C
uescape : ( ) \ [ ] { } ! @ $ % ^ * 1 2 3 A B C

 

아쉽게도 아무런 변화가 없습니다.

 

 

그럼 escape 문자를 변환하면

 

String nTag = "&#40; &#41; &#92; &#91; &#93; &#123; &#125; &#49; &#50; &#65; &#66; ";
String nUesc = HtmlUtils.htmlUnescape(nTag);
              
System.out.println("escape : " + nUesc);

 

uescape : ( ) \ [ ] { } 1 2 A B

 

잘 변환이 됩니다.

 

그런데 굳이 일반 문자나 숫자를 변환할 일은 많지 않을것 같군요.

 

- copy coding -


java로 프로그램을 할 때 파라미터로 가장 많이 사용하게 되는 ObjectVO 객체이고 VO로 값을 받거나 전달해야 하는 경우 VO의 값을 확인 하려면 디버깅모드에서 Variables에 있는 값을 확인 하거나 Vo.getXxx()로 하나씩 출력을 해봐야 하는 불편함이 있는데 ObjectMapper를 이용하면 VoJSON 형태로 변환하여 사용할 수 있습니다.



 

먼제 pom.xml에 라이브러리를 등록 합니다.

 

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->

        <dependency>

            <groupId>com.fasterxml.jackson.core</groupId>

            <artifactId>jackson-databind</artifactId>

            <version>2.11.0</version>

        </dependency>

 

main 으로 사용할 VO 파일을 생성 합니다.

 

public class SampleVo {

 

        private String username; /* 사용자ID*/

        private String name; /* 이름*/

        private Map<String, Object> mobile; /* 휴대전화*/

        private Map<String, Object> tel; /* 전화번호*/

       

        //getXxx, setXxx 생략

       

}

 

VO를 또 생성 합니다이건 Map<String, Object>로 설정한 mobile을 위한 Vo 입니다.


public class MovileVo {

 

        private String mobile1; /* 휴대전화1*/

        private String mobile2; /* 휴대전화2*/

        private String mobile3; /* 휴대전화3*/

       

        //getXxx, setXxx 생략

       

}

 

 

tel을 위한 Vo도 하나 더 추가 합니다.


public class TelVo {

 

        private String tel1; /* 전화번호1*/

        private String tel2; /* 전화번호2*/

        private String tel3; /* 전화번호3*/

       

        //getXxx, setXxx 생략

}

 

 

이제 Controller를 하나 만들고 코딩을 합니다.

MovileVo TelVo에 값을 설정하고 SampleVoMobileVoTelVo를 이용하여 값을 설정 합니다.



import com.fasterxml.jackson.databind.ObjectMapper;


        @RequestMapping(value = "/sample/test")

        public void sampleMethod(Model model) throws Exception {

              

               SampleVo sampleVo = new SampleVo();

               MovileVo movileVo = new MovileVo();

               TelVo telVo = new TelVo();

              

               movileVo.setMobile1("010");

               movileVo.setMobile2("1111");

               movileVo.setMobile3("2222");

              

               telVo.setTel1("02");

               telVo.setTel2("111");

               telVo.setTel3("2222");

              

               Map<String, Object> movileMap = new HashMap<String, Object>();

               Map<String, Object> telMap = new HashMap<String, Object>();

              

               movileMap.put("movile1", movileVo.getMobile1());

               movileMap.put("movile2", movileVo.getMobile2());

               movileMap.put("movile3", movileVo.getMobile3());

              

               telMap.put("tel1", telVo.getTel1());

               telMap.put("tel2", telVo.getTel2());

               telMap.put("tel3", telVo.getTel3());

              

               sampleVo.setUsername("copycoding");

               sampleVo.setName("카피코딩");

               sampleVo.setMobile(movileMap);

               sampleVo.setTel(telMap);

              

               ObjectMapper mapper = new ObjectMapper();

               String samString = mapper.writeValueAsString(sampleVo);

              

               System.out.println("=== sampleVo ===" + samString);

        }

 

ObjectMapper mapper = new ObjectMapper();

String samString = mapper.writeValueAsString(sampleVo);

ObjectMapper를 설정 하고 writeValueAsString()을 이용하면 JSON 형태의 String 값을 얻을 수 있습니다.

 

localhost:8080/sample/test를 호출하여 실행을 하여 log를 확인 해 봅니다.

 

=== sampleVo ==={"username":"copycoding","name":"카피코딩","tel":{"tel1":"02","tel2":"111","tel3":"2222"},"mobile":{"movile1":"010","movile3":"2222","movile2":"1111"}}

 

String형이라 다시 정리 하면

=== sampleVo ===

{

"username":"copycoding",

  "name":"카피코딩",

  "tel":{

        "tel1":"02",

        "tel2":"111",

        "tel3":"2222"

      },

  "mobile":{

        "movile1":"010",

        "movile3":"2222",

        "movile2":"1111"

      }

}

 

이런 결과를 볼 수 있습니다.


- copy coding -


java 설치는 기본적인거고 방법도 어렵지 않아 기록을 하지 않았는데 오랜만에 오라클 홈페이지에 들어가 보니 화면이 변경되어 급할 때 쉽게 찾아보려고 몇자 적어 놓습니다.


Java 다운로드


일단 ORACLE 홈페이지에 들어가면

https://www.oracle.com/index.html

심플한 안내화면을 뒤로하고 아래쪽으로 이동하고


windows java download install



Resources for의  Developers를 선택 합니다.


windows java download install


이번에도 조금 아래쪽으로 내려와 Java를 클릭 하고 


windows java download install


Java SE Download를 선택 합니다.

windows java download install


많이 보던 화면이 나타납니다.


여기에서 자신에게 필요한 Java SE 8, 11, 14 버전 중 하나를 선택해 Download를 클릭 합니다.

! oracle 홈페이지 말고 여기로 바로 오려면

https://www.oracle.com/technetwork/java/javase/overview/index.html

요기로 오면 됩니다.


어째든 Download를 클릭하면 페이지가 전환되면서


windows java download install


8버전과 관련된 다양한 자료를 다운받을 수 있지만 JDK만 필요하니 클릭


windows java download install


운영체제별로 파일이 있는데 윈도우즈용은 맨 아래 부분에 있습니다. 각자 자신의 컴퓨터에 적합한 버전을 선택 합니다.


windows java download install


License Agreement를 체크하고 다운로드를 하면 됩니다.

물론 오라클에 계정이 있어야 다운로드가 가능 합니다.

 

 

Java 설치

 

설치는 간단하니 간단하게 화면만 나열해 봅니다.

모두 기본으로 설치 합니다필요하다면 설치 폴더만 수정합니다.. 저는 나중에 설치 위치 찾기가 귀찮아 디폴트로 설치 합니다.


windows java download install


windows java download install


windows java download install


windows java download install


windows java download install


windows java download install


windows java download install


설치가 완료 되었습니다.

 

명령 프롬프트 창을 열고 확인해봅니다.

java -version


windows java download install


잘 설치가 되었습니다.


- copy coding -


1234

+ Recent posts