'java'에 해당되는 글 14건

  1. 2016.11.23 Stream (java8) + Collectors
  2. 2015.10.15 maven
  3. 2015.10.01 Ant 자동빌드
  4. 2015.08.28 10 mistakes + Alpha 1
  5. 2015.08.12 Collections
  6. 2015.08.07 ThreadLocal, File.createTempFile
  7. 2015.08.07 EL과 JSTL
  8. 2015.08.02 some JAVA keywords
  9. 2015.07.29 OSGi for Java
  10. 2015.07.20 java 7 nio2 + etc
  11. 2015.07.20 java 8 오픈
  12. 2015.06.03 디폴트 Xmx Xms 확인
  13. 2015.04.22 XPath : 간단히 XML 파싱.
  14. 2015.01.16 jdk1.5 제너릭, Concurrent, 어노테이션, enum, JMX

[java8 in action  일부 참고]

 

한마디로, Collection은 data라고 한다면 Stream은 computation이다.

 

 

<특징 2가지>

1. PipeLining

  Stream 은 unix명령어인 pipeline( "|" ) 과 같이 순차적으로 data를 처리한다. 

  (단, 실제로 unix에선 pipeline을 순차적으로 처리하지 않고, 몇줄이라도 조금씩 output이 있으면 동시처리를 한다)

 

2. Internal iteration 

  - 코드상 눈에 보이지는 않지만, 내부적으로 iteration이 일어난다.

  - 단 한번 traverse가 가능하다.  이게 끝나면 다시 new stream을 가져와야 한다.

 

 

<operation 종류> - Builder패턴과 유사하게 chain을 통해 중간단계를 여러개 거쳐 최종물 생성.

 

1. Intermediate Operation : Terminal Operation을 만나야만 동작을 한다. 

 - map, filter 등과 같이 중간에 데이타를 가공한다.

 - sorted, distinct  

 - limit, skip

 - 한꺼번에 처리가 되는만큼, 내부 동작 순서는 최적화해서 바뀐다. 

  (예: limit먼저 실행하고 다른 것 들 실행. map과 filter를 merge해서 실행)

  

 

2. Terminal Operation : 반드시 이걸로 끝나야 한다. 그래야만 intermediate Operation도 동작을 한다.

 - collect   (주로 List, Map, an Integer 리턴)

   

   ㅁ Map으로 변경

someList.stream() .collect(Collectors.toMap(AClassName::getMyCode, AClassName::getName))

   ㅁ GroupingBy

someList.stream().

.collect(Collectors.groupingBy(  AClassName::getName  ) )

 

=> Map<String, List<Person>> 형태로 리턴됨.

 

   

   ㅁ guava와 함께 쓰면:   .collect(GuavaCollectors.toImmutableList());

jp.skypencil.guava:helper:1.0.1
<dependency>
  <groupId>jp.skypencil.guava</groupId>
  <artifactId>helper</artifactId>
  <version>1.0.1</version>
</dependency>

 - forEach  (void 리턴)

 - count   ( long 숫자 return)

 

 

 

ofNullable함께 사용: REF

map으로 예제: REF

Function protoype 이용예제: REF

 

 

 

<철학>

java8에서는 stream을 이용해 multicore 개발의 복잡함과,  multihread로 인한 오류확률을 줄이고자 한다. 

          

 -> stream은 multicore에서도 parallel한 환경에서 transparent하게 작업이 가능하다. 

 일반적으로, .stream()에서 .parallelStream()으로만 바꾸면, 별도의 multithread코드 없이 parallel작업이 된다.

 

 

 

 

<forEach 예제>

 

  "hey duke".chars().forEach (c -> System.out.println((char)c));    My-Ref

  someStream.forEach (  (oneItem) -> {

oneItem.weight -= 1; 

oneItem.height += 10;

  }

 

단, 단순한  forEach는 Collector 에도 있으므로,  list.forEach( item -> blabla ); 가 가능함.

 

Posted by yongary
,

maven

java core 2015. 10. 15. 09:10

maven is project management tool for  autobuild & dependency management.


INSTALL: just download and unzip.  add bin path to $PATH.


RUN:  $mvn archetype:generate

=> defalt select.

=> groupID,package..etc:  com.ky

$cd com.ky

$mvn compile exec:java -Dexec.mainClass=com.ky.App


Posted by yongary
,

Ant 자동빌드

java core 2015. 10. 1. 14:40

Eclipse에서 프로젝트를 하나 골라서

-> Export  ->  General 밑에 Ant Buildfiles 로 하면  build.xml 이 생성된다.

 

Windows -> Show View메뉴에서 -> Ant를 고르면 우측에 Ant 작업창이 뜨고,

그곳으로 build.xml을 drag하면 build.xml로 빌드가 가능하다

 

 

장점: jenkins와 연동한 자동 build가 가능하다.  

Jenkins연동 시에  Build->Add Build Step ->Invoke Ant.

Posted by yongary
,

10 mistakes + Alpha

java core 2015. 8. 28. 15:27

Ref-Site:

 

1. 

array를 ArrayList로 전환시:

 

ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(arr));

 

(설명)

Collection인 java.util.ArrayList 는

java.util.Arrays.ArrayList와 다름.List list = Arrays.asList(anArray)  하면  static class인

   Arrays.ArrayList가 return됨: 쓰지 말것

 

 

2. array안에 value존재하는지 check시

Arrays.asList(arr).contains(targetValue);

 

3. List에서 element하나 삭제시.

Size()가 변하는 loop안이라면 Iterator를 사용하여 삭제하는 게 안전.

아니면 뒤에서부터 앞으로 Loop돌면서 삭제. (테스트 필요)

 

Iterator<String> iter = list.iterator();
while (iter.hasNext()) {  
     String s = iter.next(); //꼭 next먼저 호출.
     if (s.equals("a"))  iter.remove()//원래 remove는 가장최근 return()한 걸 삭제하는 이상한 함수임.
}

 

ListIterator의 경우에는 iter.set() 함수도 매우 쓸만하다. //이 역시, 가장 장최근 return()한 걸 치환.

 

4. 보통은 HashMap을 쓰자.  HashTable도 동일하지만 이건 synchronized가 걸려있어 조금 늦음.

Ref-Site: top 10 Q about Map

 

5. Default 생성자는 생성자가 없을경우에만 자동으로 compiler가 넣어 줌.

   => default생성자 없는 class를 상속받을 경우 super()가 필요한데 없으므로 컴파일 에러가 남.

 

6. Sort   Ref-Site:

   => Collections.sort( list, Comparator  ),  Arrays.sort( array, Comparator  ) 사용

 

        // 역순으로 정렬하기 위한 Comparator 객체 생성
        Comparator<String> reverseComparator = new Comparator<String>() {
            @Override
            public int compare(String s1, String s2) {
                return s2.compareTo(s1);
            }
        };
        
        /**참고 */
        따라서, Comparator 클래스를 구현할 때에는 compare() 메서드를 반드시 구현해야 합니다. compareTo() 메서드는 Comparable 인터페이스에서 정의되어 있는 메서드로, 객체를 자신과 비교하여 정렬 순서를 결정하는 메서드입니다. Comparable 인터페이스를 구현하면서 compareTo() 메서드를 구현해야 하며, Comparator 클래스를 구현할 때에는 compare() 메서드를 구현해야 합니다.

 

 

 

   => Set이나 Map의 경우에는 TreeSet, TreeMap 생성 후 add하면 자동 정렬 : complexity of O(logN)

REF-Site:

 - 필요시: 생성시에 Comparator 공급.

 - Sync필요시:  SortedMap m = Collections.synchronizedSortedMap(new TreeMap(...));

 

 

 

 

Posted by yongary
,

Collections

java core 2015. 8. 12. 17:53

(Sometiems ArrayList is better when no synchronize, Sometimes Vector is better because of Size doubling )

 

ArrayList : Resizable Array - fast because of index.  Add/Delete is Slow for data Copy. ==> 50% increase its array size

Vector : Similar to ArryList..  a little heavy because of synchronize processing. ==> doubles its array size

 

LinkedList: Fast for ADD/Delete.  But No Index so sequential search is slow.

 

HashSet, SortedSet,

HashMap

DelayQueue,  - - - |> BlockingQueue

Stack

 

several I/F like:

  Queue, - 보통  new LinkedList<T>();

  Deque, - 상동.    

  BlockingQueue : (waiting in some cases)

put은 queue가 꽉 차 있을 경우, take

는 queue가 비어있을 경우가 블로킹 조건이다. 

  TransferQueue

 

 

<class> 

  ConcurrentXX  Collections : thread-Safe

-ConcurrentHashMap : synchronize detail이 HashTable과 약간 다름.

   

  - SynchronousQueue: 초기 size가 0이고.. 다른Thread에서 빼려고 할때만 삽입이 가능한 놈이므로 peek도 안됨..

      

 

TreeMap -  red-black Tree 기반의 sorted NavigableMap

 

TreeSet   -  TreeMap기반.

 

PriorityQueue - Heap자료구조 기반..

PriorityQueue 클래스는 기본적으로 작은 값이 우선순위가 높은 것으로 취급합니다. 따라서, 1에서 100까지의 숫자를 PriorityQueue에 추가하면, 1이 가장 높은 우선순위를 갖게 되고, 100이 가장 낮은 우선순위를 갖게 됩니다. 따라서 poll() 메서드를 호출하면, 가장 높은 우선순위를 갖는 1이 먼저 반환됩니다.  => 체육복 코딩테스트에 사용 됨.

 

 

Posted by yongary
,

ThreadLocal은 jdk1.2부터 있었다고 하는데, 그 동안 이런게 있는지 잘 몰랐다.

 

용도는 2가지인데

1. Thread별로 싱글턴 같은 global(local)변수를 생성/관리되므로, Thread별로 분리된 변수를 사용가능.

=> REF : per-thread Singleton.

 
    ==> synchronized없이도 Lock이 자동으로 방지 될 걸로 예상 됨..(이건 좀 토론이 필요함)

 

 

1.1. 하나의 Thread안에서 여러 class가 공용메모리 처럼 사용가능. (왜냐하면 Thread안에서 global이니깐)

 

관련사이트1 , 관련사이트2

 

 

 

 File f = File.createTempFile("aaa",".tmp")  도 유사한 성격으로 동시 접근을 피할 수 있다.

 write다한 후에 보통 f.setReadOnly();

==> 똑같은 파일명으로 만들어도 알아서 숫자가 붙는 방식임. 따라서 .deleteOnExit() 설정을 꼭 해주는 게 좋다.

Posted by yongary
,

EL과 JSTL

Spring 2015. 8. 7. 14:48

참고사이트:  http://egloos.zum.com/slog2/v/3581446   https://docs.oracle.com/javaee/6/tutorial/doc/bnahq.html 

 

 

EL (expression language) -> JSP2부터 기본 지원

JSTL (JavaServer Pages Standard Tag Library ) -> c tag를 가장 많이 사용.

 

앞부분에 taglib 디렉티브로 사용함을 표시한다.

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>  // c:tag사용.

 

<EL>

${param.name} => request.getParameter("name");
${member} => request.getAttribute("member");

 

${member.name} => Member m = (Member)request.getAttribute("member");
m.getName();
${list["0"]} => List list = (List)request.getAttribute("list");
list.get(0);

 <JSTL>

<c:forEach items="${list}" var="listItem" >

<td>${listItem.title}</td>

</c:forEach> 

 

Posted by yongary
,

some JAVA keywords

java core 2015. 8. 2. 22:49

finalize(): GC calls when Instance is garbage collected. which has no reference.    참고사이트:


hashCode();  when making equals method of Object. we must consider this method().


final: (method or class) will not be inheritted.





Posted by yongary
,

OSGi for Java

java core 2015. 7. 29. 18:48

OSGI (Open Services Gateway Initiative)   REF-SITE:


- Originally targeted embedded devcies & home service GWs.

- Bundle based Fluent Life-Cycle framework.  (Bundle=jar+alpha)

   (life-cycle Layer can dynamically install/remove/start/stop bundles)

- JavaObject based SOA  


ex)  Eclipse Equinox PDE (Plug-in Development Environment)

     Apache Felix.  Reference-Site


Posted by yongary
,

java 7 nio2 + etc

java core 2015. 7. 20. 10:56

nio2  참고사이트:  copy, move, readAllLines, Files.walkFileTree(Path, FileVisitor<T> ),  WatchService,

 

기타7 문법 참고사이트

 

1. try-with-resource,  

File nFile=new File("abc.txt");
try ( InputStream in = new FileInputStream(nFile) ){



}catch (Exception e){



}

2. String in case, 

 case "abc":

 

 

 

그 외 될 뻔하다가 적용 안된 거.

     A.(multi) catch (|), 

    B. ?(return null when null).

     C.멀티Collection생성자, //ex: new ArrayList {"one", "two", "three"}; => 1.8에서도 안 됨.

Posted by yongary
,

java 8 오픈

java8~ 2015. 7. 20. 10:03

java 5와 java8은 major release이다.

java 5에서  generic, concurrent, annotation, JMX, enum, boxing/unboxing, static import  등의 기능이  update되었다면

 

 

java8에서의 핵심update는 FP 이다. 참고사이트

 

  

 

 

1. <java.uitl.function 에 추가된 함수형 인터페이스>

  • Function <T, R> - T를 입력으로 R을 출력으로 반환
  • Predicate <T> - T를 입력으로 boolean을 출력으로 반환
  • Consumer <T> - T를 입력으로 아무것도 반환하지 않는다
  • Supplier <T> - 입력을 취하지 않고 T를 반환
  • BinaryOperator <T> - 2 개의 T를 입력으로 하나의 T를 출력으로 반환 
    => c++의 unary operator override수준이 아니라서 별로 쓸일 없어 보이지만..
    minBy, maxBy는 사용하면 stream구문 없이 사용할 수 있어서 편할 듯 함.
    REF

 

 

2. <java.util.stream>

 - 배열,리스트,맵 등 Collection을 stream으로 다룰 수 있게 된다.

 

 

그리고

 -interface에 abstract method뿐 아니라 body추가.

 -OOM을 많이 유발하단 PermGen 이 사라짐. 

 - Date변환법이 좀 추가:   LocalDateTime Duration이 쓰기 좋겠네요.  REF-SITE

Posted by yongary
,

You can use the following command to find out the defaults on the system where your applications runs.

java -XX:+PrintFlagsFinal -version

Look for the options MaxHeapSize (for -Xmx) and InitialHeapSize for -Xms.

On a Unix/Linux system, you can do

java -XX:+PrintFlagsFinal -version | grep HeapSize

Posted by yongary
,

XML파싱 방법에는 문서전체를 로드해서 하는 DOM방식과, 문서를 순차적으로 읽으면서 하는 SAX(Simple Api 4 Xml)방식이 있다. 참고사이트


JDom등의 별도 라이브러리를 쓰는 경우도 있지만,

내장된 XPath가 워낙 간단해서 입문자는 무조건 이방식으로 하면 될 것으로 보인다.   이 XPath는 기존의 DOM 방식이나 SAX방식이 아닌

XDM(Xml Data Model)방식으로 불리는데, 굳이 Dom/SAX와 비교하자면 Dom방식에  약간 더 가깝다고 볼 수 있을 것 같다.



<사용방식>

//어딘가 Web에 연결해서

      HttpURLConnection con = (HttpURLConnection)apiUrl.openConnection();

 con.setRequestMethod("GET");


//using XPath 로 파싱.

InputSource is = new InputSource( new InputStreamReader(con.getInputStream()));

Document doc = DocumentBuilderFactory.newInstance()

.newDocumentBuilder().parse(is);

XPath xpath = XPathFactory.newInstance().newXPath();

zone = (String)xpath.evaluate("/result/zoneName", doc, XPathConstants.STRING);

String offTime = (String)xpath.evaluate("/result/gmtOffset", doc, XPathConstants.STRING);

time = timeAdd(timeCords[0], offTime);

Posted by yongary
,

Generics: - casting으로부터의 해방.

List<String>, 

List<?>  ?: any type extends Object

Class<?>  :  (Object).getClass()로 리턴되는 특정 class의 정보 집합.

 

JMX도 추가. (JMX등 JEE 참고사이트 )


java.util.Concurrent

 - Executor가 대표적: 멀티코어 활용.

   그러나, 일반적인 thread프로그래밍 만으로도 (green thread = single thread OS)가

   아닌 이상은 멀티코어가 어느정도 적용된다고 함.



그 외

http://skycris.tistory.com/3   1.5에 추가된

boxing/unboxing,   - int(원시 형)과  Integer간 자동 형변환.

static import, 

annotation 설명

Posted by yongary
,