티스토리 뷰

반응형

안녕하세요!

오늘은 List를 각각 쪼개서 사용할 수 있는 partition 메소드를 간단히 알아보려 합니다.

 

이전의 자바에서는 아래와 같이 리스트를 쪼개서 사용했습니다.

예를 들어 101개의 아이템이 담겨 있는 리스트의 경우 20개씩 분배해서 사용을 하기 위해서는 아래와 같이 작성했습니다. 

public List divided(List<String> list) {
  List<List> res = new ArrayList<>();
  if(list.size() > 100) {
    res.add(list.subList(0, 20));
    res.add(list.subList(20, 40));
    res.add(list.subList(40, 60));
    res.add(list.subList(60, 80));
    res.add(list.subList(80, 100));
    res.add(list.subList(100, list.size());
  } else if(list.size() > 80) {
    res.add(list.subList(0, 20));
    res.add(list.subList(20, 40));
    res.add(list.subList(40, 60));
    res.add(list.subList(60, 80));
    res.add(list.subList(80, list.size());
  } else if(list.size() > 60) {
    
    ...
  }
  return res;
}

하지만 이렇게 작성하는것보다 foreach 문을 사용하면 더 효율적일 것입니다.

public List divided(List<String> list) {
  List<List> res = new ArrayList<>();
  if(list.size() > 100) {
    for(int i=0; i<=list.size()/20; i++) {
      res.add(list.subList(i*20, (i+1)*20));
    }
  } else if(list.size() > 80) {
    ...
  } 
  ...
  return res;
}

 

위처럼 개발을 진행하게 되면 가독성면에서도 많이 떨어지는데 이를 보완하기 위해 partition이라는 메소드를 제공해줍니다. 

 

사용 방법은 정말 간단하게도 아래와 같이 한줄로 가능합니다.

final List<String> stringList = ...
final int pagingSize = 20;
final List<List<String>> partition = 
  Lists.partition(stringList, pagingSize);

만들어진 파티셔닝 리스트는 아래와 같이 사용 가능합니다.

// getter

partition.get(0); // stringList의 0~20
partition.get(1); // stringList의 20~40

 

* 2022-09-15 추가

먼저 위의 Lists 를 사용하기 위한 의존성으로는 기본적으로 제공되지 않기 때문에 Google 에서 제공하는 Guava DI 를 진행해주어야 합니다.

pom.xml 

<dependency>
  <groupId>com.google.guava</groupId>
  <artifactId>guava</artifactId>
  <version>31.1-jre</version>
  <!-- or, for Android: -->
  <version>31.1-android</version>
</dependency>

build.gradle

dependencies {
  // Pick one:

  // 1. Use Guava in your implementation only:
  implementation("com.google.guava:guava:31.1-jre")

  // 2. Use Guava types in your public API:
  api("com.google.guava:guava:31.1-jre")

  // 3. Android - Use Guava in your implementation only:
  implementation("com.google.guava:guava:31.1-android")

  // 4. Android - Use Guava types in your public API:
  api("com.google.guava:guava:31.1-android")
}

 

감사합니다~!


출처: https://stackoverflow.com/questions/12026885/is-there-a-common-java-utility-to-break-a-list-into-batches

 

Is there a common Java utility to break a list into batches?

I wrote myself a utility to break a list into batches of given size. I just wanted to know if there is already any apache commons util for this. public static <T> List<List<T>>

stackoverflow.com

 

반응형
댓글
공지사항