컬렉션에 값이 있는지 볼 때는 indexOf보다 contains를 써요

컬렉션에 값이 있는지 볼 때는 indexOf보다 contains를 써요

prefer_contains 린트 규칙은, List와 String에 값이 있는지 확인할 때 indexOf 대신 contains를 쓰라고 권하는 규칙이에요. Stable 상태이고, 공식 추천(Recommended) 규칙이며 코드 수정도 자동으로 가능해요.

출처: Use contains for List and String instances.

본문

컬렉션이 특정 원소를 갖고 있는지 확인할 때 indexOf로 인덱스를 찾는 코드는 읽기 어렵고 성능도 안 좋을 수 있어요. 그럴 때는 contains를 쓰는 게 훨씬 깔끔해요.

BADindexOf-1인지로 없는 걸 판단했어요.

if (lunchBox.indexOf('sandwich') == -1) return 'so hungry...';

GOODcontains로 있는지 없는지를 바로 확인해요.

if (!lunchBox.contains('sandwich')) return 'so hungry...';

indexOf(...) == -1은 '이 값이 없다'는 걸 간접적으로 표현하는 거라서, 의도를 한 번 더 읽어야 해요. contains는 '들어 있나?'라는 질문을 그대로 담고 있어서 바로 읽혀요. 성능 면에서도 컬렉션 타입에 따라 contains가 더 유리한 경우가 있어요.

규칙 켜기

analysis_options.yaml 파일의 linter > rules 아래에 prefer_contains를 추가하면 돼요.

linter:
  rules:
    - prefer_contains

YAML 맵 문법으로 설정한다면 이렇게 써요.

linter:
  rules:
    prefer_contains: true

더 알아보기

  • 인덱스를 직접 다뤄야 할 때가 아니라, 존재 여부만 궁금할 때 이 규칙이 적용돼요.