Drag and Drop RecyclerView in Android using Android Studio – Kotlin

얘들 아 CodeAndroid의 Vignesh입니다

이 비디오에서는 항목 RecyclerView를 끌어다 놓는 방법을 보여줍니다 이것을 설명하기 위해 ToDo List Application 코드를 사용하려고합니다 하위 작업 내에서 하위 작업 순서를 지정하는 아이콘이 필요합니다 항목 작업 열기, 여기서는 RecyclerView를위한 touchHelper를 설정하려고합니다 우리가 항목을 드래그 앤 드롭 할 수있게 해줍니다 나중에 이미지 뷰를 추가합니다

val touchHelper가 ItemTouchHelper와 같으면 콜백을 전달해야합니다 ItemTouchHelper의 객체, 우리는 SimpleCallback을 사용할 것입니다 내부에서 dragDirection과 swipeDirection을 전달해야합니다 항목을 위아래로 이동할 수 있습니다 그래서 ItemTouchHelper

UP 또는 ItemTouchHelperDOWN을 제공하고 있습니다 따라서 항목을 이동할 수있는 방법 swipeDirection의 경우 항목을 스 와이프 할 수 없음을 의미하는 0을 제공합니다 누락 된 회원을 구현해 보겠습니다 이 onSwiped는 swipeDirection을 0으로 지정했기 때문에 호출되지 않습니다

항목을 드래그하는 동안이 onMove가 호출됩니다 여기에서 우리는 아이템을 교환해야합니다 그래서 p1에서 소스 어댑터 위치를 얻고 있습니다 sourcePosition이라는 값에 저장 마찬가지로 p2 ViewHolder에서 targetPosition 가져 오기 이제 RecyclerView 목록의 항목을 바꿔야합니다 이를 위해 우리는 목록에 액세스해야합니다

그래서 RecyclerView 데이터를 저장하기 위해 list라는 전역 값을 생성합니다 전역 변수에 목록을 저장하고 어댑터에 전달하는 refreshList에 "Collections"클래스를 사용하여 sourcePosition을 사용하여 목록의 항목을 targetPosition으로 교체합니다 스와핑은 Collections 클래스 자체에서 수행됩니다 그래서 우리는 아무것도 처리 할 필요가 없습니다 항목을 교환 한 후 어댑터에 대한 변경 사항을 알릴 필요가 있습니다

그래서 나는 어댑터를 전역 변수에 저장하고있다 전역 변수를 RecyclerView의 어댑터로 설정하기 notifyItemMoved를 호출 할 필요가있는 것을 통지하기 위해서 내부에서 sourcePosition과 targetPosition을 전달해야합니다 이 onMove는 Boolean을 반환해야하므로 true를 반환합니다 마지막으로 attachToRecyclerView를 사용하여 RecyclerView에 touchHelper를 연결합니다 자, 응용 프로그램을 시작합니다

이제는 길게 눌러 작업을 이동할 수 있습니다 길게 누르지 않으려면 아이콘을 줄 수 있습니다 해당 사용자를 사용하면 쉽게 항목을 이동할 수 있습니다 그것을하는 방법을 볼 수 있습니다 아이콘 소스의 경우 드로어 블 폴더 안에있는 이동 아이콘을 복사하고 있습니다

item 자식의 레이아웃 파일에서 ImageView를 추가해야합니다 그래서 ImageView 삭제를 복제하고 있습니다 소스를 ic_move로 변경하고 id를 iv_move로 변경하십시오 이동 아이콘 전에 삭제 아이콘을 원합니다 그래서 toLeftOf와 toStartOf를 iv_move로 추가합니다 우리는 이것을 ViewHolder 내부에 링크해야한다

그 후 이동 아이콘에 대한 onTouchListener actionMasked 이벤트가 ACTION_DOWN과 같으면 드래그를 시작해야합니다 touchHelper에 액세스해야합니다 그래서이 touchHelper를 전역 변수로 변환하려고합니다 여기서 우리는 null 경고를 얻고 있으므로 null-safety를 추가합니다 null이 아닌 경우 RecyclerView에 연결하고, 그렇지 않으면 아무것도하지 않습니다

ViewHolper를 전달하여 드래그를 시작하는 touchHelper 사용 여기서도 리턴 유형으로 부울이 필요합니다 그러나 여기 나는 거짓을 전달하고있다 자, 응용 프로그램을 시작합니다 길게 누르지 않아도 항목을 이동할 수있는 항목을 볼 수 있습니다 이 재정렬은 로컬에 저장됩니다

활동을 다시 불러 오면 준비가 끝납니다 배열을 유지하려면 서버 또는 데이터베이스에 순서를 저장해야합니다 이 비디오 녀석들을위한 모든 것 나를 지원하기 원한다면 wwwpatreoncom/CodeAndroid에서 애호가가되어 그렇게 할 수 있습니다

너가 좋아하길 바래 내 다음 비디오에서 보자 좋은 하루 되세요

Install – configure android studio and run first android kotlin

어쌔 램 어큐 름와로 마투 라히 와바로 카투 채널에 오신 것을 환영합니다 이 비디오에서는 android studio를 구성하고 첫 번째 응용 프로그램을 실행합니다

당신이해야 할 첫 번째 단계는 자바를 설치하고 다운로드하는 것입니다 안드로이드 스튜디오 녹스 하지만 그것은 선택 사항입니다 Android Studio에서 나를위한 감성적 표현을 준비했습니다 모든 것을 설치할 때 문제가있는 경우 걱정 마라 주석 열에 그냥 입력하십시오

내가 너를 고치도록 도와 줄거야 먼저 Google 브라우저를 엽니 다 다음 자바 jdk 첫 번째 링크를 클릭하십시오 PC에 맞는 운영 체제를 선택하십시오 창문이있다

리눅스 하지만 전에 승인 라이센스를 받아 들여야합니다 그래서 우리는 jdk를 다운로드 할 수 있습니다 쿠우이 다운로드 jdk를 다운로드 한 후 두 번 클릭 JDK를 설치하는 방법 그런 다음 JDK를 설치 한 후 java가 올바르게 설치되었는지 확인해 봅시다 터미널을여십시오 javac를 입력하십시오

터미널이 다음과 같이 표시되면 그 의미 Java가 올바르게 설치되었습니다 이런 식으로 보이지 않으면 Java 경로를 추가해야 함을 의미합니다 가변 환경에서 두 번째 Android Studio를 설치합니다 처음 android studio 다운로드 안드로이드 스튜디오를 설치하려면이 단계를 따르십시오 이것은 리눅스 용이다

안드로이드 스튜디오를 다운로드하여 설치 한 후

Leveraging the Power of Arrow to Build Android(Kotlin) Apps using Functional Programming

[음악 재생] 좋아, 얘들 아 다시 오신 것을 환영합니다

그래서 얼마나 많은 기능적인 프로그래머가 여기에 있습니까? 승인 그럼 지금 놀라운 세션이 있습니다 화살표를 사용하여 안드로이드를 구축하는 힘 모니카 (Monika)의 함수 프로그래밍을 사용한 Kotlin 그녀는 4 년 동안 안드로이드 개발자로 일해 왔습니다 이제부터 그녀를 무대에 오르게해서 시작할 수 있습니다

[음악 재생] MONIKA KUMAR : 개발자 John을 만날 수 있습니다 Kotlin을 처음 사용하고 싶어합니다 그의 프로젝트에서 Kotlin의 함수 프로그래밍 기능 그러면 어떻게 그렇게 할 수 있을까요? 화살표를 입력하십시오 안녕, 모두들

저는 Monika Kumar Jethani입니다 나는 당신을 환영합니다 이 세션의 모든 부분을 활용하면 Arrow 기능적 프로그래밍을 사용하여 Android 애플리케이션을 구축하는 방법 그래서 저는 4 명으로 구성된 다국어 프로그래머입니다 소프트웨어 개발 분야에서 수년간의 경력을 쌓았습니다 관심 분야는 이동성과 인공 지능입니다

코드를 읽고, 코드를 작성하고, 코드에 대해 이야기합니다 그리고 나는 자바가 시작된 같은 날에 태어났습니다 얼마나 많은 사람들이 함수형 프로그래밍을 사용하기 시작 했습니까? 당신의 프로젝트에서? 좋아, 좋아이 세션에서 우리는 함수형 프로그래밍이 무엇인지 조사하고, Kotlin의 기능적 구성물 Arrow 소개, Arrow의 데이터 유형에 대해 자세히 설명합니다 유형 클래스,보다 기능적인 프로그래밍 개념 Arrow가 그 자체로 가져 오는, 그리고 샘플 Arrow 애플 리케이션

그래서 함수형 프로그래밍은 선언적 스타일을 도입합니다 당신이 무엇을해야할지 집중하는 프로그래밍의 하는 방법보다는 계산으로 평가를 처리합니다 수학 함수의 그래서 객체 지향 프로그래밍과는 달리, 프로그램에 국가가있는 곳 객체는 메소드를 통해 상태를 변경합니다

함수형 프로그래밍은 유지 보수 및 변경을 엄격하게 피할 수 있습니다 의 상태 따라서 함수형 프로그래밍의 핵심 개념은 순수한 함수입니다 따라서 순수한 함수 (normal function)처럼, 당신은 입력을 받아, 당신은 출력을 제공합니다 그러나 보편적 인 판매 포인트가 있습니다

순수 함수가 있음을 의미합니다 동일한 입력에 대해 항상 동일한 출력을 제공합니다 b = 1, b = 2, b = 10, 동일한 입력에 대해 동일한 출력을 얻을 수 있습니다 두 번째 요점은 중요한 점입니다 주문 함수는 적용된 매개 변수에만 초점을 맞 춥니 다

그것에 함수 밖에서는 작동하지 않습니다 여기 오른쪽에서 볼 수 있습니다 합계 함수는이 두 가지 이유로 순수한 함수입니다 그래서 언제든지, 내가 1을 동등하게한다면, b = 2이면 항상 출력을 얻습니다

일부 기능은 조작 요소에 초점을 맞추기 때문에 그것은 그것에 제공됩니다 그것은 인스턴스 변수 나 어떤 것이 작동하지 않습니다 함수 밖입니다 따라서 함수형 프로그래밍의 많은 장점이 있습니다 객체 지향 프로그래밍 그래서 우리는 응용 프로그램을 함수로 만듭니다

따라서 코드는보다 간결하고 모듈화됩니다 테스트가 더 쉬워집니다 그것은 예측 가능합니다 당신은 T가 1 인 것을 압니다 또한 a1, b2를 주면 3이됩니다

똑같습니다 – T에서 10을 얻습니다 안전 프로그래밍을 장려합니다 불변성과 순수성과 같은 구조를 도입함으로써 기능 그래서 함수형 프로그래밍은 언어 독립적입니다 그리고 함수를 다루는 언어 일류 시민으로서의 기능적 프로그래밍으로서의 소리 언어

예는 Scala, Haskell 및 Kotlin입니다 이러한 언어에서 함수는 다른 함수로 전달 될 수 있습니다 함수에서 반환 될 수 있습니다 변수에 할당 할 수 있습니다 그럼 Kotlin의 함수 구조를 살펴 보겠습니다

그것들은 변경 불가능한 객체를 의미하는 변경 불가능 성이며, 객체의 상태를 변경할 수 없습니다 그리고 Kotlin에서 val 키워드를 사용하여 불변성을 부여합니다 고차 함수 – 고차 함수 함수를 취하는 함수에 주어진 이름이다 매개 변수 또는 반환 함수로 람다 (Lambdas) – 또 다른 기능을 제공합니다

기능 그러나이 경우에 공급되는 기능은 이름이 없습니다 게으른 평가 – 객체 생성 처음 사용될 때까지 연기됩니다 테일 호출 재귀 – 그래서 모두들 여기서 재귀에 익숙해야합니까? 따라서 꼬리 호출은 메소드의 마지막 호출 동일한 서브 루틴에 호출됩니다 꼬리 호출 재귀, Kotlin의 꼬리 호출 최적화 재귀 호출로 마지막 호출이있는 경우입니다

확장 기능 – 어디에서 할 수 있습니까? 더 많은 메소드를 추가하여 클래스의 기능을 확장하십시오 Null 안전성 – nullable 유형을 나타낼 수있는 곳 유형 뒤에 물음표가 나타납니다 패턴 일치 – 호출 할 변형을 알아 내고, 패턴 또는 유형에 따라 다릅니다 그래서 코 틀린은 우리 모두가 알듯이, 바닥을 걸을 것입니다 자바에 있었다

그리고 그것들을 개선하려고합니다 그래서 우리 모두가 알 수 있습니다 객체 지향 프로그래밍 언어에서 자체는 객체 지향 프로그래밍 언어입니다 따라서 Kotlin은 기본적으로 객체 지향 프로그래밍의 융합입니다 기능 프로그래밍

순수한 함수형 프로그래밍 언어는 아닙니다 기능적 프로그래밍을 시행하지는 않지만, 형식화 된 함수형 프로그래밍을 지원하지 않습니다 그래서이 모든 것을 고치려면 Arrow가 들어갑니다 Arrow는 Kotlin의 표준 라이브러리에 기능적인 동반자입니다 그것은 2017 년에 소개되었습니다

최신 릴리스는 073입니다 가장 인기있는 두 가지 Kotlin 라이브러리의 융합입니다 Kategory 및 funcKTionale을 사용하면 자세한 정보를 얻을 수 있습니다

arrow-ktio에서의 Arrow에 대해 따라서 Arrow에는 세 가지 데이터 유형이 있습니다 더 많은 데이터 유형이 있습니다 하지만이 프레젠테이션에서는 세 가지 중요한 것에 초점을 맞춘다

Option, Either 및 Try입니다 그래서 그들 모두는 봉인 된 수업입니다 그리고 Option은 이름에서 알 수 있듯이, 선택적 값을 나타내는 데 사용됩니다 그래서 Option에 A 타입의 값이 있다면, 그것은 [INAUDIBLE] Some의 가치를 가질 것입니다 그래서 약간의 가치가 있다면 A가 될 것입니다

모든 값은 None이됩니다 그래서 Option은 Some 또는 None을 가질 수 있습니다 예에서 볼 수 있듯이, 우리가 someValue, Some과 문자열을 할당하려한다면, 그것을 인쇄합니다 그래서 우리는 산출물로서 어떤 가치를 얻습니다 따라서이 경우 someValue, 변수, Some 유형의 Option 값을 포함합니다

두 번째 예 – emptyValue 변수 없음 유형의 옵션 값을 포함합니다 그런 다음 옵션을위한 중요한 도구가 있습니다 어떤 유형의 경우, 어떤 작업을 수행하면, 당신은 결과를 얻을 것이다 없음 유형에서, 당신은 작업을 수행하려고 시도하지만, 당신은 결과적으로 항상 None을 얻을 것입니다 따라서이 예에서는 숫자를 볼 수 있습니다

Some 유형의 Option 유형입니다 숫자 없음은 유형 없음의 Option 유형입니다 따라서 옵션에 대한 작업을 수행하려고 할 때 type 일부는 결과를 얻는다 언제 Option 유형 None에서 작업을 수행하려고 시도하면, 당신은 결과를 None으로 얻습니다 두 번째는 출력을 없음으로 얻는 경우입니다

기본 설정을 지정하려는 경우가있을 수 있습니다 null 타입의 경우의 값 – 없음 유형 거기에서 getOrElse를 사용할 수 있습니다 그래서 당신에게 제공하는 옵션을 제공합니다 유연성을 기본 제공 None 유형의 경우 값

그래서 값은 None이고, getOrElse를 사용하면, 이를 기본값으로 지정합니다 그래서 당신이 그것을 출력 할 때, 당신은 디폴트 값을 얻습니다 None 값이기 때문입니다 그런 다음 Option의 사용 사례는 다음과 같을 수 있습니다 우리는 신청서에 양식이 있습니다

따라서 필수 항목은 주로 이메일, ID, 비밀번호, 사용자입니다 이름 이름은 Option이 될 수 있습니다 따라서 Option 데이터 유형을 사용하여 당신의 코드에서 그 이름 그런 다음, 우리 모두는 Kotlin의 when 절 스위치와 같습니다

그래서 절에는 기본값이 있습니다 따라서 기본적으로, 없음을 사용할 수 있습니다 그리고 나머지 경우에는 Some을 사용할 수 있습니다 이제 두 번째 데이터 유형 인 Isither로 넘어갑니다 그 이름에서 알 수 있듯이, 모두 이중 값 중 하나입니다

따라서 왼쪽은 예외 상황을 나타내는 데 사용됩니다 오른쪽은 [INAUDIBLE]을 나타내는 데 사용됩니다 따라서이 예제에서는 right라는 변수를 볼 수 있습니다 그리고 그것은 어느 쪽인가의 유형입니다

그래서 왼편에는 문자열이 있어야합니다 맞습니다 정수를 포함해야합니다 당신은 어느 쪽을 지정합니다 맞아요

그리고 당신이 그것을 인쇄하면, 당신은 권리를 얻습니다 그럼 두 번째 경우에 그래서 왼쪽, 예외를 나타 내기 때문에, 일부 유효성 검증 메시지를 넣을 수 있습니다 따라서 인쇄 할 때 왼쪽 부분이 인쇄됩니다 그래서 당신은 또한 어떤 디폴트 값을 넣으려고 시도 할 수 있습니다 마찬가지로, 권리가 있다면, 당신은 그냥 결과물을 낼 수 있습니다

왼쪽에 기본값을 넣을 수 있습니다 당신은 예외적 인 경우입니다 그냥 0을 출력 할 수 있습니다 따라서 이것이 가능한 예입니다 어느 쪽에서 값을 추출 할 때 사용합니다

Option과 마찬가지로, getOrElse를 Either와 함께 사용할 수 있습니다 게다가 그리고 여기에서도 왼쪽에 기본값을 제공 할 수 있습니다 그래서 여기서 다시 볼 수 있습니다, 우리는 getOrElse를 사용하여 기본값 0을 할당 알려진 부분이있는 왼쪽 부분으로 그래서 당신은 어느 쪽이 될 수 있는지 추측 할 것입니다 그 검증 자료를 표시합니다

우리 양식에는 이메일 양식이 있습니다 그래서 우리는 특정 형식이있을 것으로 기대합니다 그래서 포맷이 바르게 따른다면, 우리는 그것을 입력으로 받아 들일 수 있습니다 그렇지 않으면 유효성 검사 메시지를 표시 할 수 있습니다 어느 쪽이든의 도움으로 이제 시도해 보겠습니다

Try는 Try와 유사합니다 Java 나 C #에서 볼 수 있습니다 그래서 값이 존재하는지 확인해보십시오 존재하는 경우 성공 부분으로 이동합니다 실패하면 실패 부분으로 넘어갑니다

따라서 예제에서 볼 수있는 getQuizQuestions 실패 할 가능성이 있으며 예외가 발생합니다 그래서 그것은 Try 안에 포함되어 있습니다 그래서 Try 내부에 동봉되어 있기 때문에, 그것은 예외를 던질 수 있습니다 예외가 발생하면 출력을 실패로 볼 수 있습니다 그리고 예외 행 번호와 이름을 얻습니다

예외도 마찬가지입니다 Option 및 Either와 유사하므로 다음과 같이 할 수도 있습니다 Try 값을 추출하십시오 성공하면 b 부분을 찾습니다 그래서 우리는 실패한 b로서 성공합니다

따라서 실패한 경우 기본값을 출력 할 수 있습니다 이 경우 0입니다 그리고 성공 – b를 찾을 수 있습니다이 경우는 a입니다 승인

따라서 알려진 함수가 있습니다 Recover로 예외를 처리하는 데 사용됩니다 실패입니다 그래서 복구 – 다시, 예외가 걸립니다, 화면에 표시 할 값을 제공합니다 그 예외가 발생할 때 여기에서는 런타임 예외가 발생합니다

이렇게되면 값 0이 출력됩니다 그리고 이것은 Recover를 사용하여 수행 할 수 있습니다 그래서 try를위한 유스 케이스는 예외를 잡을 수있다 우리가 나누는 것처럼 그래서 우리는 항상 제수가 0이 아닙니다

따라서 Try 블록에서 나누기 코드를 묶을 수 있습니다 기기가 0이 아닌 경우 분할 결과를 출력합니다 값이 0이면 Try를 사용할 수 있습니다 오류 부분으로 리디렉션 할 수 있습니다 그래서 타입 클래스 – 타입 클래스는 Arrow의 중요한 특징입니다

그들은 행동을 나타냅니다 3 가지 타입 클래스가 있습니다 이 세션에서 초점을 맞추십시오 그것은 Functor, Monad 및 Applicative입니다 따라서 Functor는 래핑 된 값에 함수를 적용하는 데 사용됩니다

맵 기능 사용 그래서 여기에서 그들은 A에서 B까지의 기능을 가지고 있다는 것을 알 수 있습니다 우리는 감싸 진 값, F of A를가집니다 그리고 나서 우리는 감싸 진 값, B의 F를 얻습니다 그래서 F 포장 된 값을 변환하는 함수입니다

map은 동일한 컨텍스트 내에서 변환 된 값을 반환합니다 Functor는 어떻게 작동합니까? 펑 터는 함수와 펑터를 취하고, 새로운 펑터를 반환합니다 그래서 여기서 플러스 3이 함수라는 것을 알 수 있습니다 그러면 Functor가 생깁니다이 경우 Option

Some (2)입니다 그리고 새로운 펑터를 반환합니다 그래서 OptionSome (2)에서 연산을 수행하면 3, 그것은 우리에게 Some (5)를 줄 것이다 그래서 Some (5)는 새로운 functor입니다

맵 기능에 의해 제공됩니다 따라서 Functor에서 먼저 값은 컨텍스트에서 풀립니다 그런 다음 3을 더한 함수가 적용됩니다 결과 값은 같은 맥락에서 배치됩니다 그래서 이것은 일부 부분에서는 잘 작동합니다

이제 Option에 포함 된 None 부분이 있습니다 지금까지 함수 자체는 전혀 적용되지 않습니다 오른쪽에서 코드를 볼 수 있습니다 옵션 없음을 사용합니다 함수에 3을 더하고 싶습니다

그래서 함수는 적용되지 않습니다 결과 출력은 None입니다 그런 다음 Functor를 배열에 적용합니다 따라서 각 추가 된 값에 대해 함수가 적용되고, 우리는 새로운 가치 배열을 얻습니다 그런 다음 함수에 적용된 펑터 – 그래서 여기에서 우리는 functor 자체가 함수라는 것을 알 수 있습니다

먼저 주어진 값에서 우리는 함수를 적용합니다 즉 주어진 값은 10이므로 우리는 더하기 2를합니다 그것은 우리에게 12를줍니다 그런 다음 함수에 3을 더한 함수를 적용하여 15를 얻습니다 그런 다음 Functor는 Option, Either, Try 또는 모든 데이터 유형으로 작업하고, Functor의 인스턴스를 제공합니다

여기서 addOne을 볼 수 있습니다 Type 종류의 매개 변수를 취합니다 그래서 모든 클래스는 Option, Try, 여기에서 사용할 수있는 Functor 인스턴스를 제공하십시오 여기 구체적인 구현을 할 때 볼 수 있습니다 이걸 Option과 Try로 – 그래서 옵션 (1)의 경우, 플러스 1 기능을 수행합니다

그런 다음 Some (2)로 출력합니다 그런 다음 Try를 사용하여 동일한 작업을 수행 할 때 Try (1)을 사용하면 1 Success (2)를 제공합니다 마찬가지로, 사람들은 커스텀 펑터를 만들 수 있습니다 그러나 그들은 일정한 규칙을 따라야합니다 규칙은 구성 및 신원과 같습니다

그래서 당신은 명심해야합니다 당신의 펑터를 만드는 동안 그래서 Applicative– Applicative가 사용되었습니다 Apply를 사용하여 랩핑 된 값에 랩핑 된 함수를 적용합니다 여기에서 함수 a가 더하기 3과 같은 것을 볼 수 있습니다

또한 값에 싸여 있습니다 그리고 우리는 감싸 진 값 Some (2)를가집니다 따라서 래핑 된 함수를 값에 적용합니다 일부는 (2) Apply를 사용하고 결과는 Some (5)입니다 애플리케이터가 어떻게 작동하는지 – 우리는 문맥 안에 포장 된 함수를 가지고있다

우리는 맥락에서 가치가 있습니다 우리는 둘 다 unwrap하고 값에 함수를 적용합니다 그리고 우리는 맥락에서 새로운 가치를 부여합니다 그래서 응용 프로그램을 값 배열에 적용합니다 그래서 함수에 2와 3을 곱하면, 우리는 펑터처럼 적용 할 것입니다

각 배열 요소에 적용 해 보겠습니다 새로운 배열 요소 목록을 얻습니다 따라서 Applicative Builder로 알려진 개념이 있습니다 당신은 다른 Option 타입을 통해 그것을 묶어서 계산할 것이고, 일부 계산을 수행합니다 여기 예제에서 볼 수 있습니다

Employee라는 클래스가 있습니다이 클래스에는 세 가지 속성이 있습니다 ID, 이름 및 doj 그리고 우리는 Option 타입의 변수를 가지고 있습니다 다른 옵션 유형 – 하나는 UUID, 하나는 String, 하나는 Integer입니다

따라서 이러한 속성 값을 유지하는 데 사용됩니다 그래서 우리는지도에 Applicative와 Map을 사용합니다 모든 변수 값 [INAUDIBLE] Employee의 속성으로 Applicative Builder에 대한 USP는 다음과 같습니다 유형, 컴퓨팅 할 때의 정보를 보존한다는 것 다른 Option 유형을 넘어서 그리고 모든 값이 완료되면 콜백이 호출됩니다

값이 Some 일 때 발생합니다 값 중 하나가 없음이면 출력이 없음으로 표시됩니다 없음에서 작동하지 않습니다 따라서 모나드 – 모나드는 싸인 된 값을 적용합니다 flatMap을 사용하여 랩핑 된 값을 리턴하는 함수

여기서는 half라는 함수가 있습니다 따라서 반은 의견을 제시합니다 그리고 그 수가 짝수라면 그것의 절반을 돌려 줄 것입니다 그것이 4이면, Some (2)를 줄 것입니다 짝수가 아니면 None을 반환합니다

그래서 절반은 모나드를 반환하는 함수입니다 그리고 우리는 감싸 진 값인 Some (3)을가집니다 flatMap을 사용하여 반으로 적용합니다 따라서 3이 짝수가 아니기 때문에 반은 None을 반환합니다 4는 짝수이므로 절반은 랩된 값을 반환합니다

그 일부입니다 (2) 우리가 None 연산을 위해 똑같은 것을하려고 할 때, 그것은 아무 것도주지 못할 것이다 이미 말했듯이, 모든 작업은 일부와 작동합니다 없음으로는 작동하지 않습니다 Monad는 어떻게 작동합니까? Monad는 모나드와 모나드를 반환하는 함수를 취하고, 그리고 나서 모나드를 반환합니다

그래서 Some (3)은 모나드라는 것을 알 수 있습니다 함수 half는 함수이고, 모나드를 반환합니다 그리고 마지막 결과는 None입니다 그 자체는 모나드입니다 Monad Chaining도 가능합니다

여기서 볼 수 있습니다 절반은 3 번 호출됩니다 값은 Some (20)입니다 그래서 처음으로 반은 참여하게되고, 그것은 어떤 것을 줄 것이다 (10); 두 번째 시간, 일부 (5); 세번째, 없음 모나드 바인딩은 다음과 같은 프로세스입니다

다른 Option 유형을 결합하는 데 사용됩니다 따라서 Option 유형은 flatMap을 사용하여 결합 할 수도 있습니다 그러나 계산이 증가하고 복잡성이 커집니다 따라서이를 방지하기 위해 Monad 바인딩을 사용합니다 따라서 Monad 바인딩에서 bind 메소드는 내부적으로 flatMap을 호출합니다

그러나 성능 집약적 인 방식으로 수행합니다 그래서 우리는 세 가지 옵션을 결합한 것을 볼 수 있습니다 정수 값을 갖는 타입 그리고 결과로, 모나드 바인딩 후에, 또한 Option 유형입니다 그래서 Functor, Applicative, 및 Monad

Functor의 모든 참여자는 Applicative에서 가능합니다 그리고 Applicative의 모든 기여자들 Monad에서도 가능합니다 따라서 더 많은 기능 프로그래밍 개념이 있습니다 첫 번째는 기능 구성입니다 그 이름에서 알 수 있듯이 작곡 기존 함수에서 함수를 작성합니다

그래서 고정 기능으로 작성하십시오 고정 된 의미로, 함수 이름 두 이름 사이 그리고 그것은 그들이 왼쪽과 오른쪽 매개 변수라고 가정합니다 해당 함수에 적용됩니다 이렇게 구성된 함수는 오른쪽에서 가치를 얻습니다

왼쪽에 적용하고 계속합니다 그것이 최종 결과를 얻을 때까지 그래서 여기에서 당신은 볼 수 있습니다, 두 가지 기능이 있습니다 심지어 더 커졌습니다 그리고 그들에 대한 작품을 작곡합니다

따라서 Compose는 우선 짝수 기반 목록을 필터링합니다 둘째로, 그 결과를 더 큰 수조로 전달할 것입니다 그런 다음 greaterThanThousand를 기준으로 목록을 필터링합니다 배관 – 배관은 Compose의 반대입니다 왼쪽에서 시작하여 계속 적용합니다

오른쪽의 모든 것 그래서이 경우에는 이것이 동일한 예입니다 거기에 Compose가있었습니다 이 경우 먼저 목록을 평가합니다 더 많은 것을 위해

그리고 그 결과가 무엇이든간에 그 결과를 짝수에게 제공 할 것입니다 논리적 구성 요소 – 함수에서 작동합니다 부울 형식을 반환하고이를 부인합니다 그래서 여기에 모든 정수의 함수가 있음을 알 수 있습니다 0보다 큽니다

다시 말하면, 임대인 기능은 보완법을 기반으로합니다 이전 기능의 즉, 그것은 0보다 작은 모든 사람들을 찾을 것입니다 컴포넌트 함수는 보완 물을 찾는 데 사용됩니다 특정 기능의 그럼 우리는 목록을 가지고 있습니다 목록을 출력하면 1에서 5까지 모든 숫자를 더 많이 얻는다

남은 숫자는 그보다 훨씬 적습니다 암기는 순수 함수의 예비를 캐시하는 데 사용됩니다 우리 모두 알다시피 순수 함수 항상 동일한 입력에 대해 동일한 출력을 반환합니다 그래서 우리가 [INAUDIBLE] 함수를 캐시한다면 – 캐시 순수 함수 결과, 그것은 우리에게 도움이 될 것입니다 우리는 같은 계산을 여러 번 수행 할 필요가 없습니다

함수를 외우고 계산 결과를 저장합니다 그것에 적용된 매개 변수에 그렇다면 Arrow를 기존 Android와 어떻게 통합 할 수 있습니까? 스튜디오 프로젝트? 종속성을 추가해야합니다 이것은 의존성 목록입니다 GitHub 사이트에 나열됩니다

필요한 모든 클래스와 함수를 기반으로, 적절한 종속성을 가져와야합니다 이것은 간단한 계산기 앱입니다 두 개의 operants를 취하고, 더하기, 빼기, 곱하기, 나누기 그래서 데이터를 통합 할 수있는 유스 케이스였습니다 유형 개념

그래서 여기에 Add, Add operation, you 또한 모나드 바인딩을 결합 할 수 있습니다 유사한 유형의 옵션 여기서는 나누기 위해 Try 데이터 형식을 사용했습니다 왜냐하면 제수가 0 일 가능성이 있기 때문입니다 따라서 제수가 0이면 실패가 발생합니다

예외 이름 제수가 0이 아니면 Try는 Success 봇을 실행합니다 나는 값을 얻는다 비슷하게, 곱셈은 모두 1에서 2가 2라는 것을 압니다 3에서 1은 3입니다

따라서 Some (1)에 들어가는 것은 숫자 자체가됩니다 그래서 곱셈 – 나는 그 사건을 고려했습니다 더 많은 경우가 있습니다 마찬가지로, 값이 0이면 결과는 0이됩니다 따라서 모든 Arrow 개념을 통합 할 수 있습니다

우리가 보통하는 일에 그렇다면이 앱은 이메일을 입력하는 간단한 앱입니다 구독 버튼을 누르십시오 그래서 여기에 Option 유형을 사용했습니다 따라서 입력 된 이메일이 유효한 입력 인 경우, 변수에 저장합니다 유효한 입력이 아닌 경우 None 만 저장합니다

따라서이 경우, 추가 처리, 메일 링 목록에 이메일을 추가하는 것처럼 완료되지 않습니다 따라서 입력이없는 곳에서 볼 수 있습니다 이메일 입력은 None으로 저장합니다 입력이 제공되면 값은 Some 및 값으로 저장됩니다 그런 다음 Android 용 화살표를 사용할 때의 우수 사례 – 그래서 Arrow는 새로운 도서관이자 Kotlin입니다

우리 대부분에게 새로운 것입니다 그래서 우리는 Kotlin과 Arrow를 통합 할 수 있습니다 가능한 한 우리 프로젝트에서 부작용을 단일 지점으로 푸시하려고합니다 또한, 우리는 다른 데이터에 대해 매우 확신 할 필요가 있습니다 다른 개념, 즉 데이터 유형과 유형 수업

차이점이 있습니다 우리가 어떻게 할 수 있는지 확인해야합니다 Arrow의 주어진 개념을 사용하여 프로젝트를 모델링합니다 그래서 이미 진행중인 다양한 프로젝트가 있습니다 화살표를 사용하여 완료됩니다

Helios처럼 – Helios는 Kotlin의 Arrow 용 JSON 파서입니다 그것은 화살표를 사용합니다 그런 다음 기능 유효성 검사가 있습니다 Either 및 Try 데이터를 사용하여 양식 유효성 검사 수행 유형 따라서이 링크에서 다른 프로젝트를 확인할 수 있습니다

그래서 화살을 말릴 준비가 되셨습니까? 좋아, 잘됐다 이것이 바로 프레젠테이션의 끝입니다 모두 감사합니다 모든 검색어에 대해 내 Gmail ID에 연결할 수 있습니다 고맙습니다

Kotlin玩Android第00篇 配置Anko環境

Kotlin 프로젝트 만들기 "Kotlin 지원 포함"을 확인하십시오 '비 활동'을 선택하십시오

Anko의 Github 찾아보기 extanko_version = 0104를 복사하십시오 Gradle Scripts의 왼쪽을 클릭하십시오

첫 번째 buildgradle을 클릭하십시오 새로 복사 한 문자열을 buildscript {}에 붙여 넣습니다 오른쪽 상단의 지금 동기화를 클릭하십시오 종속성 {}에 문자열을 복사합니다

왼쪽에서 buildgradle (Module : app)을 클릭하십시오 종속성 {}에 방금 복사 한 내용 붙여 넣기 지금처럼 오른쪽 상단의 지금 동기화를 클릭하십시오 MainActivitykt로 돌아가서 테스트하십시오

Anko 함수 토스트를 입력하여 찾을 수 없는지 확인하십시오 있다면! 사실, 당신은 성공적으로 구성 될 것입니다! 여기에 빨간색 물결 모양의 선이 있지만 토스트 ()에 그 가치를주는 걸 잊었습니다 또는 직접 org

jetbrainsanko *를 가져 오는 것도 좋은 선택입니다! 이봐 요!

[ ANDROID VideoCapsula nº5 ] Trabajar con Textos en Android utilizando Kotlin

안녕! 이 새로운 Android videocache에 오신 것을 환영합니다 언어를 통해 안드로이드 프로젝트의 텍스트를 조작한다

Kotlin 프로그래밍 및이 언어에서 제공하는 기능 외에도 텍스트 문자열과 문자를 조작합니다 안녕! 이 비디오 캡슐에서, 나는 설명 할 것이다 Kotlin에서 텍스트 작업을하는 방법에 대해, 나는 새로운 프로젝트를 사용할 것이다XML 파일을 위해 형성된 기본 구조와 내가 놓을 다른

KT 파일 코 틀린 코드XML 파일에는이 TextView 객체가 있으며, 여기에 "contenidoTextos"텍스트를 ID로 입력합니다 이 TextView 객체를 사용하여 내가가는 텍스트를 화면에 표시합니다 비디오 캡슐을 따라 조작

이 객체를 사용하려면, KT 파일의 "onCreate"기능 내에서 다음을 배치합니다 코드 이 작업이 완료되면이 TextView 객체에 변수 "textShow"의 내용 이 방법으로, 나는 "textShow"라는 변수에 화면에 표시하고 싶을 때, 이것들의 의미에 대해 걱정하지 마십시오 코드 라인은 다른 비디오 스트림에서 설명하기 때문에 음 음,이 짧은 소개 후에, 나는 Kotlin이 텍스트 작업, 두 가지 유형의 데이터 사용 "문자열"과 "숯"

"Strings"는 텍스트이면 "문자열"유형의 모든 데이터가 하나 이상의 문자 저장 문자 그대로의 텍스트를 배치 할 때 변수, 배열 등에서 "문자열"로 저장됩니다 큰 따옴표 사이에 삽입해야하지만 필수적이지 않다 작은 따옴표로 묶거나 오류를주지 않으면 예 : "Char"데이터 유형은 데이터가 포함 된 데이터를 조작하기위한 것입니다 하나의 문자가 "Char"유형의 데이터에 배치되면 문자 실수 데이터로 저장 될 리터럴 문자는 필수적입니다 변수, 배열 등의 "Char"유형은 작은 따옴표로 묶이거나 예를 들어 다음과 같이 오류가 발생하지 않습니다

"String"및 "Char"유형의 데이터가 텍스트 또는 Unicode 인코딩을 사용하는 alico-numeric 문자 데이터가 서로 호환되지 않습니다 예를 들어, 유형 "Char"의 데이터를 "String"유형의 변수에 입력하면 변환이 수행되지 않습니다 암시 적입니다 예를 들어이 코드를 작성하면 오류가 발생합니다 이를 방지하려면 함수를 사용하여 변환을 수행해야합니다

"Char"데이터의 toString () toString () 함수를 사용하면 다른 유형의 데이터를 변환 할 수 있습니다 이 유형의 데이터가 데이터 유형과 호환되는 경우 "문자열"을 "문자열"로 변경하십시오 "문자열"(예 : 부울, 정수 등) 또한 다음과 같은 경우 오류가 발생합니다 예를 들어, "Char"유형의 변수에 "String"을 저장하려고했습니다

이렇게하면 : 이를 피하기 위해 "Char"로 변환하는 대신 솔루션을 "String"을 "Char"유형의 배열로 변환합니다 여기서 각 위치는 채워집니다 "문자열"의 문자로, 그리고 우리는 이렇게 할 수 있습니다 : 이를 통해 "Char"유형의 배열을 만들었습니다 각 배열에 저장되었습니다 배열의 위치, 리터럴 텍스트의 각 문자 및 variable "textShow"배열이 저장되었습니다

내가 말했듯이, 어떤 "String"이외의 데이터는 호환 가능하다면 toString () 함수를 사용하여 "String"으로 변환 할 수 있습니다 그러나 "문자열"데이터를 다른 유형의 데이터로 변환 할 수도 있습니다 데이터, "문자열"데이터가 데이터 형식과 호환되는 한 변환하고 싶습니다 예를 들어, 형식의 숫자를 변환 할 수 있습니다 "문자열"을 "정수"로 변환합니다

상당히 흥미로운 Kotlin의 기능 세트가 있습니다 "문자열"을 특정 데이터 유형, 예를 들어 "정수"로 변환하지만 데이터 "String"이 "Integer"와 호환되지 않는 경우 오류를주고,이 데이터를 null로 변환하십시오 이러한 기능은 다음과 같습니다 예를 들면 보시다시피, 그것은 null 값을 반환했습니다 왜냐하면이 코드 라인에서는 "String"을 "Integer"로 변환하는 것을 나타내었지만, 상기 변환이 숫자 "Integer"가 아닌 함수는 null 값을 반환했습니다 우리가 일할 때 필요한 경우 여러 "문자열"데이터로, "String"유형의 여러 데이터를 연결하거나 결합하여 단일 데이터를 형성 할 수 있습니다 "문자열"

예를 들어, "String"유형의 두 가지 문자 텍스트를 결합 할 수 있습니다 이 공용체를 이런 식으로 변수에 저장하십시오 : 이 코드에서 알 수 있듯이 "String"유형의 두 데이터를 단일 line, "text1"및 "text 2"를 사용하면 참여할 수 있습니다 유형 "char"의 데이터와 "string"이 결합 된 결과 우리가 기억하기 때문에 "문자열"데이터로 표시되거나 저장되도록 예정되어 있습니다 "char"데이터는 한 문자 만 저장할 수 있습니다 예를 들면 다음과 같습니다

1 우리가하려고하면 두 차트 유형 데이터를 조인 할 수 없습니다 오류 또는 예기치 않은 결과를 고려해야합니다 우리가 사용할 수있는 문자열 또는 char 유형의 데이터 데이터 유형으로 수행 할 수있는 고유 한 코딩 차트와 거리가 이러한 데이터와 문자 또는 시퀀스를 삽입하는 것입니다 이스케이프라는 문자들 예를 들어 이스케이프 문자 백 슬래시 n을 사용하면 줄 또는 이스케이프 문자 백 슬래시 이스케이프 문자가있는 표를 만들 수 있습니다 텍스트로 충돌하는 문자를 표시하는 데 사용할 수 있습니다

견적 텍스트로 표시하는 예제는 항상 bar를 사용할 수 있습니다 거꾸로 된 작은 따옴표 텍스트로 큰 따옴표를 표시하려면 이중 백 슬래시를 사용할 수 있습니다 따옴표 백 슬래시는 백 슬래시를 작성하여 텍스트로 표시 할 수 있습니다 거꾸로 된 막대 또는 달러 기호를 표시하려면 텍스트로서 우리는 이런 식으로 백 슬래쉬를 할 수있다 달러 기호 법원 링크도 쓸 수 있습니다 이스케이프 시퀀스를 사용하는 예를 들어이 일련의 문자로 나쁜 숫자는 제외하고 값을 사용하여 고유 한 인코딩에있는 문자 3을 표시 할 수 있습니다

코드에서 문자 나 이스케이프 시퀀스를 사용할 때 16 진수 이중 따옴표 안의 verani 또는 오류가 발생하지 않는 경우 우리가 string 형 데이터를 가지고 호기심을 가지고 작업 할 때 언어를 사용하면 코드에 텍스트 문자열을 쓸 수 있습니다 여러 줄 바꿈 및 탭이있는 특정 형식 그 텍스트는 화면 상에 표시 될 수 있으며, 이 형식의 이스케이프 문자를 사용할 필요없이이 형식을 사용해야합니다 3 배에 대한 스트레스를 줄이는 큰 따옴표를 대체하십시오 예를 들어 텍스트 문자열의 처음과 끝에 따옴표 화면에 텍스트를 표시하여 볼 수 있듯이 문자를 사용하지 않고 텍스트에 배치 된 탭 및 줄 바꿈 escape kotlik은 우리가 조작 할 수있는 다양한 기능을 제공합니다 이 함수들 사이의 텍스트는 대문자로 식별됩니다

거리 유형의 텍스트 또는 예를 들어 채팅 유형 문자 반면에 소문자에 대한 함수는 string의 전체 텍스트를 예를 들어 소문자로 채팅하는 문자 대신 텍스트의 첫 번째 문자 만 변환하려는 경우 대문자 예를 들어 대문자로 대문자를 사용할 수 있습니다 이런 식으로 기능하다 텍스트의 첫 글자 만이 대문자로 변환 된 것을 볼 수 있습니다 이 함수는 문자열 유형의 데이터에만 적용될 수 있습니다 if 우리가 얼마나 많은 것을 알고 싶다면 데이터 유형 char darah 오류에 적용됩니다 문자에 스트레스 유형 텍스트 문자열이 있습니다

라이트 또는 텍스트에 대한 임의의 변수에 대해 렌즈 함수를 사용할 수 있습니다 말 그대로 이 함수는 유형 차트 göttling의 데이터에는 적용 할 수 없음이 분명하기 때문에 공백을 제거 할 수있는 함수 세트를 제공합니다 함수를 화면에 표시하는 텍스트 문자열에서만 트럼프는 스트림의 처음과 끝에서 공백을 제거합니다 공백을 제거한 후 볼 수 있듯이 문자열에 5가 있습니다 두 개의 공백 만 제거되었으므로 공백을 남기고있는 텍스트 문자열의 앞과 뒤에있는 우리의 데이터 형식이 제거되지 않고 텍스트 문자열의 중간에있는 Star는 기능이있는 하나 또는 여러 줄로 구성됩니다

트럼프 마진 우리는 첫 번째 문자 또는 각 문자열 줄의 첫 문자는 해당 문자열과 일치하는 한 함수에 표시된 문자 (예 : 각 줄의 첫 글자는 다음과 일치하므로 제거되었습니다 우리가하고 싶은 일이 트림 마진 기능에 표시된 편지는 우리는 여행 기능을 사용하는 별 앞에 공간을 제거 이런 식으로 시작하다 당신은 그것이 문자열이 7 개의 문자를 가지고 있다는 것을 나타내는 것을 볼 것입니다 편지 이 3 개의 공백 1 2 및 3 대신에 뒤에있는 공백을 없애려면 텍스트 예를 들어 trip 함수를 사용합니다 이 기능 옆에있는 텍스트 뒤에 공백이 생기고 다시 작동합니다

신청서 여러분은 문자열이 이미 네 개의 문자 만 가지고 있음을 우리에게 보여줄 것입니다 텍스트 끝의 두 공백 이것과 이것은 제거되었습니다 우리가하고자하는 것이 데이터 유형으로부터 텍스트 조각을 얻는 것이라면 거리 코드 플레이트는 이상한 것을 나눌 수있는 기능 세트를 제공합니다 텍스트 문자열에서 이러한 함수 중 하나가 분리됩니다 여러 가지 방법으로 사용할 수 있지만이 비디오 캡슐에서는 나는이 함수에서 가장 공통적 인 부분에 초점을 맞출 것이다

작은 텍스트 문자열에있는 문자열 유형 하위 사슬의 구분 기호로 나타내는 문자 집합 및 모두 이 서브 텍스트 문자열은 배열의 다른 위치에 저장됩니다 변수에 다음 텍스트를 저장하면 예를 들어 생성됩니다 텍스트 문자열 내의 각 단어는 다음과 같이 구분됩니다 이 단어들 각각을 이것에서 추출하고 싶다면 스크립트를 잘 작성하십시오 스트림을 개별적으로 배열에 저장 나는 이렇게 할 수있다 split 함수는 모든 문자를 가져갔습니다

문자열의 처음부터 그 문자열과 일치하는 첫 번째 문자까지 이 경우에는 하이픈 인 함수의 괄호와 이 문자들은 배열의 첫 번째 위치에 저장되었습니다 표시 텍스트 변수에 생성되고 저장되지만 이 함수는 우리가 원하는 경우 배열에 저장할 하위 체인 수입니다 이 방법으로 한계 매개 변수 방금 작성한 매개 변수를 사용하여 함수에 하이픈 문자를 사용하여 최대 두 개의 하위 체인에서 스트레스를 중지합니다 구분 기호로 사용하고 배열에 보관하십시오 이미 일부 göttling을 알고 있습니다

대문자와 소문자의 차이는이 언어의 문자입니다 대문자로 쓰여진 글자는 소문자로 쓰여진 글자와는 다른 것입니다 쓰여진 split 함수에 separator 문자를 넣으면 함수가 끝에 대문자가 아닌 경우 소문자 이 문제를 해결하기 위해 잘 분리 된 문자로 인식 할 것입니다 split 함수는 ignoré case 매개 변수가 있습니다 구분 문자는 똑같이 취급됩니다

대다수는 대문자 또는 소문자로 작성됩니다 이 코드로 2 개의 하위 체인을 멈추게하는 함수를 말하고 있습니다 구분 기호로 대문자 또는 소문자로 된 문자 i를 사용하는 최대 값 이 함수 외에도 법원 링크는 하위 체인을 얻기위한 다른 기능을 제공합니다 다른 큰 텍스트 문자열의 텍스트 스트림에 적용 할 때 만들 수있는 슈퍼 문자열입니다 사이에있는 모든 문자에 해당하는 하위 문자열 만 첫 번째 문자는 예를 들어이 코드를 사용하여 문자열의 끝까지 함수의 괄호 응용 프로그램을 실행할 때이 함수가 문자를 반환했음을 알 수 있습니다 그들은 첫 글자에서부터 또는 텍스트의 끝까지의 줄 안에 있습니다 대신, 앞의 sup 문자열은 비슷한 동작을하지만 이 경우이 함수는 최초의 캐릭터에 일치하는 캐릭터 라인의 최초의 캐릭터 함수의 괄호 사이에 구분 기호 문자가 지정된 경우 이 함수를 사용하여 이전 코드를 수정 한 경우 첫 문자와 첫 문자 사이에 문자 h 만 표시되어 있음을 알 수 있습니다

스트림의 위치와 분리 문자와 일치하는 첫 번째 문자 sub string 함수를 사용하면 하나의 하위 텍스트 문자열을 얻을 수 있습니다 우리가 나타내는 위치 사이에있는 극단적 인 데이터의 이 함수를 사용할 때 우리는이 함수를 고려해야한다 캐릭터들 사이의 공간과 공간 사이의 위치를 ​​고려해보십시오 첫 글자 앞에 있고 마지막 글자 뒤에있다 응용 프로그램을 실행할 때 어떤 일이 일어 났는지는 첫 번째 앞에 놓이는 스트레스의 위치 0에있는 문자 문자 2와 3 사이에 위치한 2 위의 문자 sub 함수 문자열은 또한 위치를 우리가 하위 체인을 가져 가고자한다면,이 함수는 지시 된 위치와 지시 된 위치의 사이에있는 문자 예를 들어 하위 문자열을 구성하는 문자열 당신이 볼 수 있듯이이 기능은 텍스트 문자열의 끝에 2 위치 2 다른 기능 재미있는 제안은 칵테일이 색인 해제되고 기능으로 색인 해제됨을 의미합니다

index off 시스템은 지정된 문자를 찾을 수 있습니다 사슬의 시작 부분부터 시작하는 글자 세트 첫 번째 문자의 위치 번호를 반환하여 함수에서 지정된 첫 번째 위치 첫 번째 문자 앞에 위치하며 숫자가 0 인 경우 함수는 여러 문자를 나타냅니다 텍스트 문자열을 첫 번째 문자와 비교하는 문자 이 함수를 찾아야하는 문자열은 그렇지 않으면 1을 뺀 값을 반환합니다 이 함수의 예제와 일치하는 문자를 찾을 수 있습니다 그 함수가 문자의 위치 번호를 반환했는지 또는 그 위치가 반환 된 것을 볼 수 있습니다 문자열에서이 함수의 첫 번째 일치 두 개의 선택적 매개 변수가 있으므로 작업이보다 완벽 해집니다

시작 인덱스 매개 변수는 함수에 이러한 방식으로 예를 들어 결정된 위치로부터의 일치 이 문서에서 알 수 있듯이 나는 텍스트 또는 스트림의 시작 부분에서 위치 2에서 찾는 텍스트 함수를 사용하려면 두 번째와 세 번째 문자 사이에 있어야합니다 소문자로 된 글자와 대문자로 된 글자 모두 우리는 매개 변수 나는 그것을 무시했다 우리가 원하는 경우 이러한 매개 변수는이 방식으로 단순화 될 수 있습니다 of의 함수는 index와 비슷한 동작을하지만 말할 필요가없는 스타일의 시작부터 문자를 찾는 대신 왼쪽에서 오른쪽으로 스트림의 끝에서부터 시작합니다 오른쪽에서 왼쪽으로 다른 흥미로운 기능이 제공됩니다

카운트 링크가 대체되고 재생 기능이 재생 기능으로 대체 될 수 있음 텍스트 형식의 문자열 내 모든 문자 또는 집합 괄호 사이에 지정된 문자와 일치하는 문자 예를 들면 기능 이 코드 줄에서 볼 수 있듯이 모든 코드를 문자 또는 텍스트 문자열에서 문자 p로 찾음이 함수 또한 ignore case 매개 변수도 있습니다 소문자와 대문자는 똑같이 취급됩니다 replace 첫 번째 함수는 함수와 유사하게 동작합니다 대신 첫 글자를 바꿀만한 차이점 만 있으면됩니다 문자열의 시작 부분에서 시작하여 문자 또는 함수의 첫 번째 매개 변수에 지정된 문자 이 경우 첫 번째 문자 또는 텍스트 만 대체되었음을 알 수 있습니다

모든 문자 또는 kotlik을 대체하는 대신 범위를 제공합니다 문자열 데이터와 비교 또는 확인하는 함수들 별표 유형 데이터에 적용된이 함수는 비어 있습니다 true 값이며 해당 데이터가 빈 텍스트 문자열이거나 포함되어있는 경우에만 공백 두 경우 모두에서 볼 수 있듯이 true 값을 반환하고 예 이런 방식으로이 코드 라인을 수정했습니다 당신은 지금 그가 타입 스트립의 데이터 이후 거짓을 반환했다는 것을 볼 수 있습니다 기능이있는 공백이 아닌 하나 이상의 문자를 포함합니다

문자열 또는 채드 데이터의 텍스트가 다른 텍스트와 동일한 경우 비교할 수있는 값입니다 두 텍스트가 동일하고 동일한 유형 인 경우 데이터 거리 또는 차트 이 함수가 true로 돌아가고 false를 반환하지 않으면 데이터를 반환합니다 코드를 실행할 때 응용 프로그램이 true 값을 반환한다는 것을 알 수 있습니다 두 텍스트가 같고 데이터가 같은 유형이기 때문입니다 데이터가 char 유형 인 경우에도 발생합니다

이제 동일한 텍스트를 가진 두 데이터를 비교하려고 시도하지만 하나는 타입 거리와 다른 것은 친절한 char보고있다 일어난다 당신은 텍스트가 동일하더라도 그것이 틀렸기 때문에 그것이 틀린 것을 보게 될 것입니다 동일한 유형의 데이터를 비교할 때 고려해야 할 또 다른 사항 두 문장은 kotlik이 대문자와 소문자가 다른 점입니다 두 데이터가 같은 텍스트이지만 텍스트에 소문자가있는 경우 다른 글에서 대문자로 쓰여진 글자는 이 기능을 해결하기 위해 두 개의 서로 다른 텍스트로 인식합니다 또한이 매개 변수와 관련된 ignoré 매개 변수도 있습니다 소문자 및 대문자는 예 이 경우 볼 수 있듯이 트릭을 반환했습니다

왜냐하면 대문자와 소문자는 똑같이 취급되었으므로 텍스트는 동일합니다 이 매개 변수를 원하면이 방법으로 단순화 할 수 있습니다 compare 함수를 사용하면 두 유형의 텍스트를 비교할 수도 있습니다 문자열이나 char이지만 다른 연산을 사용한다 이 함수는 두 텍스트가 동일한 경우 0 값을 반환합니다 이 함수는 텍스트가 0이면 0이 아닌 숫자 값을 반환합니다

이 함수의 다른 예가 이 하나 텍스트가 동일하기 때문에 함수가 0을 반환했다는 것을 알 수 있습니다 이 코드 라인으로 변경 텍스트가 반환되기 때문에 반환하는 값은 더 이상 0이 아닙니다 다른이 함수는 함수가 다음과 같은 것과 동일한 문제를 가지고있다 대문자 및 소문자를 포함하고 있으며이를 해결하기 위해 매개 변수 대소 문자 무시 이 함수는 텍스트가 포함 된 데이터를 비교하는 데 사용될뿐만 아니라 변수 리터럴 번호와 같은 객체 유형 우리는 텍스트 타입의 문자열 내에 그것이 포함되어 있는지를 알 수 있습니다 우리가 지정하는 특정 텍스트는 돌아 오는 기능입니다

true이고 우리가 지정한 텍스트 문자열이 유형 스타 인의 결정된 데이터 및 예를 들어 거짓을 반환하지 않는 경우 그 함수가 wave라는 단어 이후 잔인한 값을 반환했다는 것을 알 수 있습니다 이 코드 대신 ol 문자가 포함되어 있습니다 wave라는 단어에는 문자 c가 포함되어 있지 않으므로 false를 반환합니다 앞서 언급했듯이 차트 데이터 유형은 한 문자 만 사용하지만이 유형의 데이터는 차례로 작동합니다 number는 숫자 코드를 나타내는 숫자 값을 나타냅니다

의 고유 한 코딩 내에서 또는 그 예를 들어 우리가 형식 차트의 데이터로 쓰면 편지 eñe는 241 번 글자와 같을 것입니다 내가 문자를 숫자로 바꿨을 때 알 수 있듯이 번호가 나타났습니다 241은이 편지에 할당 된 번호이지만 조심해야합니다 이 숫자는 글자에 따라 달라 지므로 글자에 할당됩니다 이것이 우리가 작업하고있는 알파벳의 이유입니다

두 개의 차트 유형 데이터를 수학 기호와 연결할 수 없음 우리가 문자열 데이터 덕분에 합계는 어떤 형식 데이터 char는 우리가 사용할 수있는 숫자 일 수 있습니다 이 유형의 데이터에 대한 광범위한 숫자 함수 빼기 및 더하기 함수는 숫자 값을 늘리거나 줄일 수 있습니다 char 유형의 문자와 연관되어있는 문자를 표시합니다 예를 들어 작업 후 결과 숫자와 관련 이 코드를 사용하면 11 단위 문자 eñe와 연관된 숫자 값을 표시 한 다음 문자를 표시합니다 이 연산 결과의 수와 관련해서도 똑같은 일이 일어날 것입니다 더하기 함수로 값을 줄이는 대신 증가시킬 것입니다

여기 비디오 캡슐을 끝내고 그가 어떻게 우리가 텍스트 및 해당 데이터와 관련된 유형을 관리하십시오 이 비디오가 끝나면 다음 비디오에서 당신을 좋아하고 보았습니다 아래 캡슐이 비디오 나 설명에 남겨 두겠습니다 추천 동영상을 보거나 내 프로필을 방문하여 모두보기 내 동영상

Kotlin + Watch Faces (Android Dev Summit ’18)

[음악 재생] 예레미어 워커 : 좋습니다 안녕, 내 이름은 제레미 워커 야

저는 Google의 개발자 플랫폼 엔지니어입니다 그리고 나는 너에게 어떻게하면되는지 이야기하고 싶었다 나는 Kotlin을 사용하여 시계 생성 작업을 훨씬 쉽게 만든다 WEAR OS 그래서 시계 얼굴은 지금 일종의 힘든 일입니다

그리고 약 600 행의 코드를 작성해야합니다 Android 또는 WEAR OS에서 실행하는 멋진 앱과는 다릅니다 여기서 많은 UI를 XML 형식으로 선언 할 수 있습니다 실제로 모든 것을 수동으로 페인트해야합니다 그리고 나서 여러분은 많은 코드를 포함시켜야합니다

주변 모드에서 언제인지 확인하십시오 당신은 배터리 수명을 아프게하지 않습니다 그래서, 나는 생각을하려고 노력했다 우리가 발표 한 I / O에서이를 개선하고 작년에 Kotlin에 대한 공식 지원 그래서 나는 생각하기 시작했다

이것을 쉽게하기 위해 Kotlin을 사용합니까? 그리고 나는 모든 것을 개종 시켰어 코드 라인을 많이 줄인 Kotlin에게 하지만 코 틀린과 뭔가 다른 걸 찾았 어 그걸 더 멋있게 만들었 어 그리고 그것은 DSL이라고 불리는 것입니다

그렇다면 Kotlin DSL은 무엇입니까? 도메인 특정 언어가 무엇인지 이해하는 가장 좋은 방법은 정기적 인 프로그래밍 언어와 비교하는 것입니다 그래서, 다시 도메인 특정 언어 나를 위해, 그것은 정말로 도움이되지 않았다 그러나 일반적인 프로그래밍과 비교하면 Kotlin 또는 Java와 같은 언어 당신은 많은 키워드를 가지고 있고, 당신은 클래스, 메소드, 그리고 당신은 반대편에있는 멋진 큰 앱을 상대방에서 만들고, 특정 작업이나 도메인에 초점을 맞추는 DSL입니다 그래서, 그것은 많은 기능을 포기합니다

특정 작업을 수행 할 수있게 해줍니다 실제로는 외부 DSL을 사용했을 가능성이 높습니다 그것을 깨달았다 예 : SQL 데이터베이스 조작

그것은 DSL입니다 따라서 문자열 조작을위한 정규 표현식입니다 그래서 그들은 각각 독립적 인 구문을 가지고 있습니다 그들은 많은 기능을 감소시킵니다 메소드 나 클래스를 작동시키지 않아도됩니다

당신은 그들 중 하나에 응용 프로그램을 작성하지 않을거야 적어도, 나는 희망하지 않는다 SQL의 경우 첫 번째 키워드 종류는 동사로, 당신이 할 일을 나타냅니다 어쩌면 당신이 선택하거나 업데이트 할 것입니다 여기에서의 단점은 여러분도 아시다시피, 이것을 문자열 리터럴로 넣어야합니까? 그래서, 당신은기도하고 모든 것을 철자하기를 바랍니다

런타임까지 제대로 작동하지 않을 수도 있습니다 당신은 그것을 통해 해킹하고 무슨 일이 일어나고 있는지 알아 내야 만합니다 따라서 Kotlin DSL을 사용하면 실제로 문자열에서 추출됩니다 그리고 그것은 코드에서 올바르게 처리됩니다 유형 검사를 할 수 있습니다

코드 힌트와 모든 좋은 것들을 가지고있다 귀하의 IDE와 함께 제공됩니다 그래서, 당신은 그것이 무엇인지에 대한 아이디어를 가지게되었으므로, 정말 두 가지 구조를 보여주고 싶습니다 그리고 저는 후자를 사용합니다,하지만 하나는 "연결된 메소드 호출" 다른 하나는 "람다 둥지"입니다 DSL을 인식하는 것은 실제로 주관적입니다

당신이 그것을 볼 때 당신은 그것을 압니다 그럼, 어떤 것을 보자 그래서, 이것은 SQL 용 Kotlin DSL입니다 당신은 아마 그것을 볼 수 있고 SQL을 안다면, 너는 그것을 즉시 이해할 수있다 그리고 그것은 Slice와 같은 모든 동사입니다

그리고 나서 Select All, 그리고 나서 Group By, 그 다음에 Order By, 그리고 나서 I Limit 그리고 이것은 모든 유형을 검사하고 코드 힌트를 얻습니다 그래서 당신은 잘못된 것을 철자하지 않습니다 그리고 이것은 꽤 훌륭하고 이해할 수 있습니다 이것은 DSL입니다

그러나 내가 정말로 좋아했던 시계 얼굴을위한 DSL은, "중첩 된 람다"구조였습니다 따라서 시계 모드를 만드는 것입니다 바로보실 수 있습니다 시계 만들기는 동사입니다 하지만 당신이 내 구조를 보면, 당신은 아무것도 몰라요

시계를 만드는 것에 대해 알지 못할 수도 있습니다 그러나 당신은 아마 지금 무슨 일이 벌어지고 있는지 이해할 수있을 것입니다 아날로그 시계 얼굴 좋아, 디지털이 아니기 때문에 팔이있다 그림 물감

좋아, 그걸 알아낼 수있어 손의 치수, 시침, 분침, 초침 알았어 시계 얼굴 배경 이미지 그래서 그게 전부입니다

그것은 매우 선언적입니다 그래서 당신은 즉시 이해할 수 있습니다 그리고 이것은 모든 유형의 체크이며 코드 힌트를 얻습니다 그리고 모든 좋은 것들 그리고 결국 나는이 좋은 작은 시계 얼굴을 일없이 얻을 수 있습니다

이제 600 라인, 그들은 모두 사라지지 않았다 나는 그들을 도우미 수업에 넣고 그것을 결합했다 더 중요한 수업과 함께 이 DSL을 해석합니다 하지만 시계를 만들면 DSL에 대해서만 알면됩니다

그래서, 다음은 뭐야? 이것은 코드 랩으로 한 실험의 일종입니다 코드 랩을 확인하십시오 새로운 시계 모드를 만드는 데 15 분 밖에 걸리지 않습니다 Kotlin 시계 코드 만 검색하면됩니다 실험실 – 이런, 정말 길다

Google 코드 랩을 검색하면됩니다 WEAR OS 또는 Kotlin에서 검색합니다 시계 모드를 만드는 방법을 볼 수 있습니다 코드를 볼 수 있습니다 내가 DSL간에 어떻게 전이했는지에 대한 소스 코드 그것을 작은 시계면으로 해석했습니다

하지만 더 중요한 것은 희망이 있습니다 조금 DSL에 관심을 갖고 말하기를, 이봐, 이걸 내 프로젝트 중 하나에서 사용할 수있어 그것을 조금 더 좋게 만들기 위해서 또는 SQL 용 DSL과 같은 것을 사용할 수 있습니다 테스트 용으로 하나 있습니다

그리고 하나는 내 것과 더 비슷합니다 Kotlin 코딩에서 HDML을 수행하고 유형을 검사 할 수도 있습니다 어느 것이 내가 내가 모델링 한 것의 종류 이야기 해줘서 고마워요 내가 얘기하게

그리고 잘하면 내가 너를 잡을거야 DSL에 조금 관심이 있습니다 고맙습니다 [박수 갈채] [음악 재생]

3 Platforms in 5 Minutes with Kotlin (Android Dev Summit ’18)

[음악 재생] WOJTEK KALICINSKI : 안녕하세요 내 이름은 워텍입니다

그리고 나는 너에게 짧은 이야기를 나누고 싶었다 새로운 Kotlin 멀티 플랫폼 프로젝트 경험에 대해 Kotlin에서 13 그래서 우리가이 회의에 올 때, Android에 대해 이야기하고, Android에서 Kotlin을 실행하는 것에 대해 이야기하십시오 안드로이드 애플 리케이션을 만들기 위해, 우리가 정말로 의미하는 것은 Kotlin JVM입니다

그게 우리가 알고있는 코 틀린이야 Java 바이트 코드로 컴파일됩니다 그런 다음 dex 파일로 변환 할 수 있습니다 Android에서 실행하십시오

그러나 클라우드 서버, 데스크톱, 등등 이제 실제로 Kotlin의 두 가지 맛이 있습니다 또는 컴파일 타겟 첫 번째, Kotlin JS, 달리기 웹 브라우저 환경의 JavaScript 또는 클라우드 기능 또는 Nodejs와 같은 것입니다

그리고 나서 Kotlin native가 컴파일됩니다 네이티브 라이브러리의 코드를 처리하는 방법 다양한 플랫폼을 실행하거나 타겟팅 할 수 있으며, 심지어 IOS, 데스크톱 애플 리케이션, WebAssembly, 그리고 심지어 안드로이드와 같은 그러면 우리는 실제로 이것을 어떻게 시작해야할까요? 그래서 Kotlin 13은 새로운 프로젝트 구조를 도입했습니다 Kotlin 멀티 플랫폼이라고 불리는 새로운 플러그인입니다

그리고 만약 당신이 그것을 당신의 어떤 모듈에도 적용한다면, 그런 다음 프리셋 세트에서 선택할 수 있습니다 이러한 플랫폼을 타겟팅 할 수 있습니다 여기 예를 들어 Android 라이브러리를 타겟팅하고 있습니다 및 js 대상 이제 이것을 모듈에 추가하면, 자동으로 각 플랫폼에 대한 소스 세트를 생성합니다

특정 Kotlin 파일 따라서 Kotlin 파일을 js 메인 폴더에 넣으면, 그들은 컴파일되거나 자바 스크립트 파일로 변환됩니다 이제 Kotlin이 구체적으로 무엇을 의미합니까? 미안 해요 – 플랫폼 특유의 Kotlin? 이제 문서를 찾아보고 찾아 본다면 Kotlin 패키지 각각에 대한 페이지, 오른쪽 상단에있는 마우스로 마우스를 움직여보십시오 당신은이 다색 칩을 볼 수 있습니다 컴파일 대상을 알려줍니다

이 라이브러리를 사용할 수 있습니까? 그래서 여기, 예를 들어, Kotlin 브라우저 패키지 문서 및 창 인터페이스에 액세스 할 수있는 아마 웹 브라우저 환경에서만 js 대상에서 의미가 있습니다 그리고 그것이 그 방법입니다 이제 다행스럽게도 많은 핵심 요소가 라이브러리와 함수는 모두 사용할 수 있습니다 컴파일 대상 실제로, 네 번째를 볼 수 있습니다, Kotlin common, 이것은 순수한 코 틀린임을 의미합니다

플랫폼과 독립적으로 실행할 수있는 라이브러리 타겟팅 사실 멀티 플랫폼 플러그인을 추가하면 플랫폼 별 소스 세트와 함께 프로젝트에, 당신은 또한 공통 소스를 얻을 수있는 곳으로 설정합니다 플랫폼 독립적 인 코드를 넣으십시오 이제 플랫폼 독립적 인 코드에 관한 것은, 플랫폼 API를 호출 할 수 없습니다 그것은 특정 또는 안드로이드 특정 js를 호출 할 수 없습니다 아피스 물론 다른 방법은 효과가 있습니다

플랫폼 별 코드를 가질 수 있습니다 공유 라이브러리에 따라 달라집니다 또는 소스 세트 그래서 모든 것을 알고, 나는 단지 예제 애플 리케이션을 작성하기 시작했다 Kotlin 멀티 플랫폼에 대해 알아보십시오

그리고 나는 작은 스도쿠 게임을 만들기로 결정했다 이제 Kotlin 멀티 플랫폼에 대해 내가해야 할 한 가지는 앱을 한 번 작성하고 실행할 수있는 툴킷이 아닙니다 그것을 도처에 Android 앱을 만들 필요가 있습니다 안드로이드 특정 코드로, 평소처럼 그러면 JavaScript 코드가있는 웹 페이지가 나타납니다

항목을 초기화하기 만하면됩니다 내 애플 리케이션, 라이프 사이클 UI 등을 가리킨다 그런데, 내가하는 일은 나의 모든 공유 비즈니스 논리이다 제 경우에는 스도쿠 엔진입니다 나를 위해 Sudoku 보드를 해결하고 생성합니다

나는 그것을 꺼내서 공유에 넣는다 라이브러리는 Kotlin 공통을 사용합니다 사실,이 라이브러리에있는 유일한 소스 세트입니다 공통점이다 그래서 모든 코드를 거기에 넣었습니다

이는 모든 플랫폼에서 사용할 수 있음을 의미합니다 내가 목표로 정했던 승인 하지만 그때 나는 생각했다 좋아, 나는이 핵심 엔진을 가지고있다 내 Sudoku 코드를 해결하기 위해

그러나 나는 또한 보드를 스크린에 그려 넣고 싶다 그리고 왜 각 플랫폼에 대해 코드를 작성해야합니까? 개별적으로 동일하게 보일 경우 별도로? 그래서 나는 생각하지 않았다 화면에 그리기위한 API가 있다면 완전히 독립적 인 플랫폼, 뭔가 다중 플랫폼 캔버스가 될 수 있습니까? 하지만 내가하고 싶은 것은 실제로하고 싶다 각 플랫폼 구현에 위임하게하십시오 그래서 안드로이드 캔버스를 사용하고 싶습니다

HTML을 사용하는 동안 Android에서 그릴 수 있습니다 캔버스를 웹 사이트에서 그립니다 문제는, 방금 Kotlin 공통 코드가 모든 플랫폼 인터페이스를 호출하십시오 그래서 나는 이것들에 정말로 의지 할 수 없다 이 모듈에서 내보내십시오

그러면 Kotlin에서 어떻게 작동합니까? 음,이 기대와 실제 메커니즘이 있습니다 예상되는 클래스를 공통 코드로 선언 할 수있게 해줍니다 이것은 Java에서 인터페이스를 정의하는 것과 거의 흡사합니다 그리고 각 플랫폼 별 소스 세트에서, 나는 실제 구현을 제공한다 플랫폼 API를 사용하고 의존 할 수있는 Android 캔버스와 같은 이제, 내 공통 소스에서 그 의존성을 추가 할 때 다른 하나를 설정하면 다음과 같이 보입니다

하지만 사실, 특정 플랫폼 용으로 컴파일 할 때, 그러한 js, 이 종속성은 실제로 올바른 HTML5 캔버스를 사용합니다 [징] [킬킬 웃음] 좋아, 내가 프로젝트에 대한 링크 만 보여줄 수 있다면 모두가 그것을 볼 수 있도록, 그것은 좋을 것입니다 [웃음] 네 연설자 1 : [INAUDIBLE] [킬킬 웃음] [박수 갈채] WOJTEK KALICINSKI : 맞습니다 [음악 재생]

Re-stitching Plaid with Kotlin (Android Dev Summit ’18)

[음악 재생] FLORINA MUNTENESCU : 안녕하세요 내 이름은 Florina Muntenescu이고 나는 Google의 개발자 옹호자 그래서 지난 몇 달 동안 3 명과 함께 우리 동료들과 함께, 우리는 격자 무늬를 돌려 놓기 위해 노력해 왔습니다

유행에 그래서 더 정확하게, 격자 무늬는 응용 프로그램입니다 그것은 처음에 동료 인 Nick Butcher에 의해 개발되었습니다 재료 디자인을 보여주는 방법 그리고 여기서 보시는 것은 실제로 2016 년에 앱 상태가 꽤 좋았을 때, 격자 무늬의 영광의 날을 보자

그래서 Nick은 여기에 많은 API를 사용했습니다 애니메이션, 전환, 모든 메소드 벡터에서 drawables 그래서 이들 모두가 앱을 실제로 만들었습니다 그들은 실제로 사용자 경험을 향상 시켰습니다 그래서 Plaid [INAUDIBLE] 데이터는 세 가지 다른 출처에서 왔는데, 그리고 2016 년부터 지금까지의 이러한 자료들은, 음, 그 중 일부는 더 이상 사용되지 않습니다

그래서 그것은 세 가지 근원 중에서, 우리는 하나와 조금 남았습니다 그래서 우리가 가진 멋진 멋진 UI 기능들 모두에서, 우리는 거의 아무것도 남기지 않았습니다 우리는 꽤 지루한 응용 프로그램을 남겼습니다 그래서 우리는 우리가 이것을 좋아하지 않기를 결심했다 우리는이 깨진 기능을 수정하기로 결정했습니다

그러나 이것과 별개로 우리는 우리가 뭔가를 향해 가고 싶었던 아키텍처에서 모듈화되고 확장 가능합니다 관점 하지만 그 점은 Plaid가 UI 샘플로 개발되었지만 아키텍처 샘플로 그래서 당신은 모든 동점을보기 위해 놀랄 것입니다 코드의 종속성, 그리고 음, 실제로 조금 뒤떨어 진 코드입니다

왜냐하면 Nick 2014 년에이를 구축하기 시작했습니다 그 당시에는 앱 아키텍처에 대한 가이드가 없었습니다 우리가 작년에 발표 한 그리고 우리가 코 틀린을 가지고 있었지만, 우리는 실제로 그것을 사용하지 않았습니다 그래서 우리는 Plaid를 다시 만들고 싶다는 것을 알고있었습니다 그러나 우리는 그것을 올바른 방법으로 다시 만들고 싶었습니다

미래의 변화에 ​​대비하여 좋은 상태로 유지해야한다 우리가 만들고 싶었던 그래서이 이야기에서 우리가 배운 것을 말해주고 싶습니다 또한 우리 앱에서 Kotlin을 어떻게 활용할 수 있었는지를 보여줍니다 그래서 우리는이 독창적 인 가이드를 앱 아키텍처에 발표했습니다 그러나 당신이 그것을 읽으면, 당신은 그것이 또한다는 것을 볼 것입니다

여전히 매우 모호합니다 그래서 우리는이 주요 클래스들을 가지고 있습니다 우리는 우리의 응용 프로그램을 설계해야합니다 그러나 우리는 몇 가지 분명한 지침을 만들고 싶다고 결정했습니다 그래서 우리는 앱에서 몇 가지 주요 유형의 클래스를 정의했습니다

우리는 또한 일련의 규칙을 정의했다 각 클래스에 대해 그럼 이들이 어느 것이 었는지 봅시다 그래서 우리는 RemoteDataSource를 정의했습니다 실제로 요청 데이터를 구성하기 만하면됩니다 API 서비스에서 데이터를 가져와야합니다

정보 요청 만하면됩니다 응답이 수신되었습니다 다음으로 우리는 LocalDataSource를 가지며, LocalDataSource의 역할 디스크에 데이터를 저장하는 것입니다 따라서 공유 환경 설정에서이 작업을 수행 할 수도 있습니다 또는 데이터베이스에서

다음으로 저장소를 가지게 될 것이다 데이터를 가져오고 저장하는 것입니다 또한 선택적으로 인 메모리 캐시를 수행 할 수도 있습니다 따라서 저장소가 클래스가됩니다 이는 로컬 데이터 소스와 원격 데이터 소스를 중재합니다

비즈니스 로직이 매우 복잡했기 때문에, 우리는 다른 레이어를 추가하기로 결정했습니다 유스 케이스를 추가하기로 결정했습니다 따라서 유스 케이스의 역할은 데이터를 처리하는 것입니다 비즈니스 로직을 기반으로합니다 작고 가벼운 수업이 될 것입니다

그것도 재사용 될 수 있습니다 따라서 사용 사례는 리포지토리 및 / 또는 기타 용도에 따라 다릅니다 사례 다음에는 뷰 모델이 있습니다 따라서 ViewModel의 역할은 노출하는 것입니다

UI에 의해 표시 될 데이터 및 동작을 트리거하는 데이터 사용자의 작업에 따라 그리고 ViewModel은 유스 케이스에 의존한다 입력으로 ViewModel은 아마도 ID를 얻습니다 따라서 ID가 필요한 경우 예를 들어, 상세 화면 용 ViewModel입니다 그리고 물론, 그것은 사용자의 행동을 입력으로 받아 들일 것입니다 그리고 결과물로서 라이브 데이터를 반환합니다

다음으로, UI에서 우리는 활동과 XML로 작업 할 것입니다 따라서 이들의 역할은 데이터를 표시하는 것입니다 액션을 ViewModel에 전달할 수 있습니다 입력으로 그들은 선택적인 ID를 얻을 것입니다 및 사용자의 행동

그래서 우리는 우리의 애플리케이션이나 아키텍처를 살펴 보았습니다 우리는 이것을 세 개의 층으로 나누었습니다 데이터, 도메인 및 UI 레이어 우리는 한걸음 더 나아가서 좀 더 나아지기로 결정했습니다 우리가 사용하고있는 방식으로 비난 받았다 [? 데이터?] 또는 우리가 사용하고있는 도서관에서 그래서 우리는 LiveData가 실제로 그것이 활동이나 단편과 함께 사용될 때 빛난다

그래서 우리는 실제로 LiveData만을 유지하기로 결정했습니다 ViewModel과 UI 사이에 차이점이 있습니다 그리고 더 좋은 점은 좋은 통합 때문입니다 LiveData와 DataBinding 사이, 우리는 XML에서 DataBinding을 사용하기로 결정했습니다 그러나 다시, 이러한 모든 제약 조건들과 함께 우리가 설정 한 이러한 모든 지침은 우리가 실제로 구현할 수있는 많은 방법들이 있습니다

이런 종류의 건축 그리고 우리는 Kotlin과 Kotlin 언어 기능을 알고있었습니다 이 점을 개선하는 데 도움이 될 것입니다 그리고 더 정확하게, 우리가 특히 좋아할 것 Kotlin이 지원하는 기능적 구성 요소입니다 사실, 우리가 만들어야 할 첫 번째 결정 중 하나 비동기 작업을 처리하는 방법은 무엇입니까? 그리고 우리는 코 루틴으로 작업하기로 결정했습니다

우리 앱의 거의 백본으로 왜냐하면 코 루틴으로 시작하는 것이 쉽기 때문입니다 coroutines 및 응답을 처리합니다 그리고 더 정확하게, 우리가 좋아하는 것 코 루틴에 범위가 있다는 사실입니다 예를 들어, 활동을 시작한다고 가정 해 봅시다 네트워크 요청을 실행 중입니다

당신은 언제 당신이 그 활동을 뒤로 누르고 그 활동을 끝내고, 또한 해당 네트워크 요청을 취소합니다 그래서이 coroutines의 범위 지정 우리가 좋아했던 것이 었습니다 그래서 이것은 우리가 ViewModel에서 결정한 것을 의미합니다 우리가 시작하는 곳이 될거야 우리는 코 루틴을 취소하고 있습니다

coroutine과 LiveData 사이를 전환합니다 그러나 ViewModel 위의 다른 모든 레이어의 경우, 우리는 단지 서스펜션 기능을 사용합니다 그러나 이러한 중지 함수는 결과 클래스를 반환합니다 더 정확하게 말하자면이 결과에는 두 가지 유형이 있습니다 성공 또는 오류

우리가 확신하고 싶었 기 때문입니다 여기저기서 예외를 던지지 않을거야 오히려 이러한 예외, 오류, 국가를 대표한다 그래서 코 틀린에서 흥미로운 것은 클래스를 확장 할 수 있기를 원한다면, 그것을 오픈으로 표시해야합니다 따라서 이것은 기본적으로 클래스가 최종적이라는 것을 의미합니다

상속을 사용할 때는 고의적이어야합니다 그래서 이것은 Kotlin이 정말로이 아이디어를 지원한다는 것을 의미합니다 상속을 선호하는 구성 그러나 오픈 클래스를 사용하는 것보다 더 잘할 수 있습니다 봉인 된 클래스를 사용할 수 있습니다

봉인 된 클래스를 사용하면, 우리는 [INAUDIBLE] 클래스의 클래스를 제한 할 수 있습니다 이는이 파일 밖에서 클래스를 확장 할 수 없다는 것을 의미합니다 우리가이 결과 클래스를 사용할 때가 많았습니다 우리는 일반적으로 그것을 내부에서 사용할 것입니다 그래서, 우선 스마트 캐스트를 지원합니다

그래서 이것은 결과가 성공할 때 쉽게 할 수 있다는 것을 의미했습니다 뭔가해라 결과가 오류이면 다른 작업을 수행하십시오 그러나 우리가 그것을 사용할 때마다 우리가 항상 모든 사건을 다루고 있는지 확인하기를 원했습니다 우리는 실수로 알고 있다면, 우리는 무언가를 처리하지 않고, 컴파일러를 원했습니다

이봐, 너 뭔가 잊어 버렸어 오류 케이스를 처리하는 것을 잊었습니다 그래서 이것은 때가 철저해야한다는 것을 의미했습니다 그러나 식으로 사용할 때만 철저합니다 그래서 우리는 철저한 속성을 만들었습니다

그래서, 더 정확하게, 우리는 T에 확장 속성을 만들었습니다 여기서 우리는 단지 객체를 반환 할뿐입니다 우리가 가진 또 다른 문제가 있습니다 그래서 우리는 코멘트 클래스와 답글에 대한 코멘트를 가지고있었습니다 그래서이 둘의 차이점은 사실입니다

그 주석은 또한 사용자에 관한 정보를 보유하고있다 의견을 게시했습니다 그래서 그것은 표시 이름과 초상화 URL을 가지게 될 것이고, 답글을 사용하는 주석은 거의 트리 구조입니다 주석의 응답을 보유하고있는 그리고 답장의 응답 등등 하지만 우리가해야 할 일은 코멘트를 작성하는 것입니다 답글과 사용자 객체가있는 주석의 그래서 당신은 이렇게 말합니다

좋습니다 우리는 새로운 생성자를 만들 것입니다 우리에게 매개 변수, 사용자 및 답글에 대한 설명을 얻습니다 그리고 그게 다야 하지만 그 일은 우리가 실제로하지 않았기 때문입니다

클래스가 두 개의 서로 다른 레이어에 있기 때문에 이렇게합니다 그리고 코멘트가 답글에 대한 코멘트에 대해 알아야하는 이유는 무엇입니까? 왜 사용자에 대해 필연적으로 알아야합니까? 데이터가 어딘가에서 온 것일 수도 있습니다 이 API를 변경해야하는 이유는 무엇입니까? 그래서 우리가 사용하게 된 것은 확장 기능입니다 그래서, 더 정확하게, 우리는 확장 함수를 만들었습니다 사용자 개체를 기반으로 한 댓글에 대한 댓글에 그것은 주석을 작성합니다

따라서 확장 기능을 만들 때, 당신은 공개 필드에 액세스 할 수 있습니다 그래서 이것은 우리가 실수로, 개인 구현 데이터 액세스 또는 변경 그리고 그것은 우리가 수업에 집중할 수있게 해줍니다 그들이 그것을 연장하지 않고 무엇을하는지 집중했다 따라서 공용 API를 변경할 필요가 없다는 의미였습니다 개인 구현 세부 사항에 액세스하지 않아야합니다

그래서 데이터 클래스에 대해 좋아하는 것은 사실입니다 값 객체가 있다는 것을 테스트에서 사용하면 빛난다 그래서 예를 들어, 우리는 코멘트에 upvote 플래그를 가지고 있습니다 그래서 우리가 코멘트가 upvoted 여부를 확인하기 위해 테스트를 구축, upvoted 플래그를 false로 설정하여 주석을 작성합니다 어떤 의견이든간에, 우리는 예상 된 결과가 코멘트, 초기 코멘트, 하지만 그 upvoted 플래그와 함께 사실

그러나 그 일은 특히 우리의 경우에는 주석에 너무 많은 필드가 있기 때문에, 실수하기 쉽습니다 그리고 실제로 무엇이 빠졌는지 쉽게 알 수있었습니다 여기서 중요한 것은 upvoted 플래그가 변경되었다는 사실입니다 Kotlin을 사용하면 복사 방법을 사용할 수 있습니다 그리고 거기에서 우리는 객체의 복사본을 만들 것입니다

에 호출됩니다 그리고 우리는 깃발을 세우고 있습니다, 우리가 실제로 가지고있는 깃발 변화, 그리고 그게 전부 야 코드가 더 간결하고 읽기 쉽도록 끝나고, 더 이해하기 쉽다 그럼 다른 예를 들어 봅시다 우리의 응용 프로그램에서 우리는 원격 데이터 소스 의견을 게시 할 수 있습니다

그리고 여기서, 우리는 결과를 반환합니다 그리고이 방법 안에서, 우리는 새로운 코멘트 요청을 만들 것입니다 우리는 백 엔드에서 그 요청을 트리거 할 것입니다 우리는 그 반응을 기다릴 것이다 그리고 우리는 응답을 처리하고 결과 성공 또는 오류 결과, 필요한 것에 따라 그러나이 코드를 살펴보면 실제로 충분하지 않습니다

왜냐하면 당신의 장치가 오프라인 일 때, 이 코드는 충돌합니다 그래서 우리가 실제로해야 할 일은 모든 요청을 감싸는 것입니다 try-catch 내부 그리고 우리에게는 많은 요청이 있습니다 그래서 우리는 계속이 try-catch를 추가하고 추가하는 것을 보았습니다

사방에, 그리고 우리의 방법이로드되었습니다 그래서 우리는 무엇에 집중할 수 없었습니다 응답을 만드는 데 정말로 중요했습니다 요청을 트리거합니다 그래서 우리가 한 것은 최상위 함수를 만드는 것입니다

그래서 이것은 서스펜션 기능이 될 것입니다 그것은 우리에게 람다를 정지시키는 매개 변수와 오류를 줄 것입니다 메시지 그래서 여기에 전화가 걸립니다 try-catch 내부에 포장 한 다음 빌드합니다

예외의 경우, 결과 [INAUDIBLE]이 (가)있는 오류 메시지를 기반으로 오류가 발생했습니다 그래서 이것은 우리의 모드 데이터 소스에서, 안전한 API 호출을 만들 수 있습니다 실제로 우리에게 중요한 전화를하십시오 다른 함수 내부 이처럼 코드가 더 읽기 쉽고 더 쉬워졌습니다

이해하다 그래서이 안전한 API 호출은 말하고있었습니다 첫 번째 매개 변수로 호출이 있음 오류 메시지를 두 번째 오류 메시지로 보냅니다 그러나 Kotlin에서 메서드의 마지막 매개 변수 람다, 당신이 할 수 있다는 것을 의미합니다 이것을 후행 람다 (lambda)로 사용하십시오

그래서 이것은 당신이 이것을 부를 때, 이 두 매개 변수를 전달하는 대신, 우리는 단지 오류 메시지를 전달할 수 있습니다 함수의 매개 변수로 메서드를 호출하려면 후행 람다 구문을 사용하십시오 이와 같이 코드가보다 간결 해지고, 그러나 그것은 정말로 더 가독합니까? 그래서 우리가 이것을 보았을 때, 그것은 느꼈습니다 여기에서 가장 중요한 것은 오류 메시지입니다 정말로 그렇지 않습니다

우리에게 중요한 점은 이 게시물의 댓글입니다 그래서 우리는 코드가 더 간결하지만, 그것은 더 가독성을 의미하지는 않습니다 그래서 간결함이 반드시 좋은 것은 아닙니다 따라서 Kotlin이 이러한 모든 종류의 옵션을 제공하더라도 및 기능, 염두에두고 실제로 생각하는지 이 모든 것이 필요하거나 올바른 장소에서 사용하십시오 다른 예가 있습니다

그래서 우리가 코 틀린으로 전환하자마자, 특히 우리의 활동에서 우리가 한 첫 번째 일 우리의 모든 견해를 만들 [부적절] 왜냐하면 우리는이 null 가능성을 모두 처리하기를 원치 않았기 때문입니다 하지만 우리는 코드를 다시 살펴 봤습니다 우리는 이것을해서는 안된다는 것을 알았습니다 일부 견해, 예를 들면, 우리의 결과가없는 견해, 특정 조건이 충족 될 때만 팽창되었습니다 사실 null 허용은 좋았습니다

Nullability는 의미가 있습니다 무효 성은 우리에게 무언가가 빠져 있다는 것을 말해주었습니다 우리는 그것을 실제로 처리해야합니다 그래서 전반적으로, 우리는 코 틀린 (Kotlin) 코 루틴과 같은 불변성, 기능 시민, 우리의 응용 프로그램을 도울 수 있습니다 그리고 앱 아키텍처에 대한 가이드와 함께, 우리가 이것을 유지 보수 할 수 있도록 도와 줬다

신속한 개발 아키텍처 우리가 갖고 싶었던 것 고맙습니다 [박수 갈채] [음악 재생]

Jsoup #1. Обработка данных в Android с использованием Jsoup (Kotlin HTML Parser). Jsoup Tutorial

안녕하세요 여러분, 시청자의 요청에 따라 Now Android 채널에 오신 것을 환영합니다 Jsoup와의 작업에 대한 정보를 업데이트하지만 이미 집에 있습니다

과제, 이제 다음 수업에서 무슨 일이 일어나는 지 알 수 있습니다 시작하려면 프로젝트를 만들고, 필요한 모든 것을 구성하고 연결하십시오 의존성, 스튜디오 설정 열기, 당신이 설치 한 Kotlin의 버전은 13입니다 탐색 편집기를 활성화해야합니다

조각으로 이제 gradleproject를 열어 지정해야합니다 버전 탐색 및 종속성 추가 인수로 일하는 중 안전한 인수를 사용하여 인수를 전달하는 플러그인 추가 LiveData로 ViewModel 추가하기 탐색 구성 요소 Jsoup는 HTML 코드 작업을위한 Java 라이브러리입니다 그것은 데이터를 추출하고 조작하기위한 매우 편리한 API를 가지고있다

기울기 코 루틴과 피카소 매니페스트에 대한 권한을 추가합시다 인터넷으로 작업하기 itemxml 마크 업 열기 이것은 하나의 요소의 마크 업이다 여기에 카드가 있습니다 RelativeLayout> 이미지 뉴스> 타이틀 뉴스> 설명 뉴스> 추가 정보 activity_main

xml 열기 여기 조각 컨테이너입니다 NavController (후기 초기화가있는 필드 추가) NavController – 조각 탐색 관리 용 네비게이션을 관리하려면 지정된 ID를 가진 컨트롤러를 찾아야합니다 즉, ID로이 메소드는 컨테이너를 찾고 컨트롤러를 사용하여 네비게이션을 제어합니다 BottomNavigationView, Drawer Menu, ActionBar Menu와 같은 구성 요소로 작업을 사용자 정의하기위한 다양한 메소드가 포함 된 클래스 이전 단편으로 돌아갈 수 있으려면 onSupportNavigateUp 메소드를 재정의해야합니다 다음 단원에서는 조각을 만들고, 코 루틴을 시작하고 숙제를 할 것입니다 시청 해주셔서 감사합니다! 그것처럼! 채널을 구독하여 새로운 버전을 놓치지 마세요!

Taking Advantage of Kotlin in Your Android App with Sean McQuillan (GDD India ’17)

[음악 재생] 연사 : 시작하겠습니다 안녕하세요, 저는 Sean McQuillan입니다

저는 Android 개발자 옹호자입니다 그리고 오늘 저는 코 틀린에 관해 당신과 이야기 할 것입니다 그래, 우리는 강사 주도의 훈련을 할거야 오늘 그게 무슨 뜻이야? Kotlin에서 코드 연구소를 운영하기 위해 도움을 받으러 여기 올거야

그래서 나는 너를 도울거야 나는 약간의 지시를 걸어 갈거야 그리고 우리는 청중에 몇 가지 TA를 가지고 있습니다 그들은 당신이 가진 어떤 문제라도 당신을 도울 것입니다 오늘 내가 할 일은 우리가 우리의 다운로드를 설치함으로써 시작할 것입니다, Android Studio에서 프로젝트를 컴파일하는 중입니다

그 다음 약 10 분 강의를 드리겠습니다 그런 다음 코드 연구소의 일부에서 작업 할 것입니다 다시 이야기하겠습니다 우리는 코드 랩의 일부를 다시 사용할 것입니다 이 코드 랩에서 우리가 할 일은 Java 애플리케이션을 Kotlin으로 마이그레이션하는 것입니다

우리가 함께 만든 주소록 응용 프로그램입니다 그것은 Java로 작성되었습니다 그리고 우리는 Kotlin 변환기를 사용할 것입니다 우리는 Kotlin에 추상화를 작성하려고합니다 그리고 우리는 그것이 어떻게 가능한지를 볼 것입니다

우리의 상용구 코드를 줄이는 데 도움이됩니다 유지하기 쉽고 간결하고 읽기 쉬운 코드를 제공하십시오 그리고 우리는 몇 가지 일반적인 문제를 피할 것입니다 더 나은 코드를 작성하는 데 도움이되는 추상화를 작성합니다 그러니 계속 뛰어 들어 보자

가서 그 링크를 따라 가라 맨 위의 코드 랩을 다운로드하여 시작하십시오 1 단계와 2 단계를 수행하고 요점을 알려면됩니다 어디 안드로이드 스튜디오에서 그것을 컴파일거야 그렇게하면 우리 모두 다운로드 할 수 있습니다

모든 의존성 [음악 재생] 나는 대부분의 사람들이 그 지점에 있다는 것을 알았다 Android Studio에서 종속성을 다운로드하는 곳입니다 따라서 Wi-Fi 휴식이 효과적이었습니다 Kotlin과 함께 제공되는 정말 멋진 기능 중 하나입니다

코 틀린은 – 죄송합니다 Android Studio의 Java to Kotlin 변환기입니다 그것을 사용하려면 프로젝트에 Kotlin이 있어야합니다 로 시작하도록 구성되었습니다 그리고 자바 파일을 선택할 때마다, 코드 메뉴로 이동할 수 있습니다

Java 파일을 Kotlin으로 변환하십시오 이 변환기에 대한 정말 멋진 기능입니다 내가 제일 좋아하는 것들은 마술처럼 보인다 내가 그것을 사용할 때마다 – 붙여 넣을 때이다 클립 보드의 Java 코드를 Kotlin 파일로 변환하고, Java 코드를 자동으로 Kotlin으로 변환합니다

그것은 붙여 넣습니다 그래서 내가 지금 이야기하고 싶은 것은 단지 모든 Kotlin 구문 기본에 대한 개요 우리는 오늘 코드 랩에서 사용할 것입니다 따라서이 함수 선언을 살펴볼 수 있습니다 바로 여기, 우리는 단계적으로 그것을 거치게 될 것입니다 따라서 Kotlin에서 함수를 정의하고 싶을 때, 재미있는 핵심 단어로 정의됩니다

그래서 여기에 함수, 합, a와 b 두 개의 매개 변수가 있습니다 매개 변수에는 유형이 있습니다 a는 정수 유형이고 b는 정수 유형입니다 그리고 이것은 코 틀린 (Kotlin) 전체에 공통된 구문입니다 변수 선언 다음에 변수의 유형을 넣으십시오

따라서 이것은 자바 프로그래밍과는 다릅니다 언어, 분명히 다른 방법입니다 비슷하게, 함수의 리턴 타입 인수 뒤에 나열됩니다 따라서 두 개의 매개 변수가있는 함수 합계입니다 정수를 반환합니다

그리고 Kotlin에 대한 또 다른 멋진 기능 세미콜론은 선택 사항입니다 JavaScript와 마찬가지로 Kotlin의 디자이너 우리가 수 년 동안 우리가 코드에 세미콜론을 넣거나 세미콜론을 넣지 않아야합니다 아니요, Kotlin 코드에 세미콜론을 넣으면 안됩니다 가지고있는 반 패턴으로 간주됩니다 세미콜론은 Kotlin 코드에 있습니다

한 줄 구문으로 함수를 정의 할 수도 있습니다 당신이 여기에서 볼 수 있습니다 여기서는 함수 합을 정의합니다 다시 두 개의 매개 변수를 취하고 더하기 b를 반환합니다 그래서 그것은 바로 그 표현입니다 그리고 우리는 할당 연산자를 순서대로 사용합니다

이 방법으로 함수를 정의하십시오 언제든지 사용할 수 있습니다 당신은 함수를 정의하기를 원한다 이와 같은 단일 표현식으로 구성됩니다 여러 개의 표현식을 만들고 싶다면, 중괄호 구문을 사용해야합니다

우리가 잘 알고있는 Kotlin은 기본 인수도 제공합니다 예를 들어, 우리는 함수, 합, 대개 두 개는 정수 유형을가집니다 기본값은 2입니다 그래서 당신이 이것을 부를 때마다, 당신이 인수를 지정하지 않으면 기본적으로 2로 설정됩니다

다음은 변수 선언에 대해 설명하겠습니다 여기서는 두 변수를 정의하고 있습니다 이름이 불렀다 다른 하나는 참석자라고합니다 이름은 val이고 참석자는 var입니다

그래서이 이름은 JavaScript와 비슷합니다 그래서 나는 다른 문자열을 지명 할 수 없다 니키타가 영원 할거야 참석자는 변경할 수 있습니다 그래서 나는 그것을 인스턴스화하는 배열리스트에 할당한다

하지만 나중에 내 소스 코드에서 할 수있어 그것을 다른 배열 목록에 지정하십시오 그래서 가변 변수입니다 Kotlin은 실제로 Kotlin과 Java의 차이점이 있습니다 프로그래밍 언어가 Kotlin에 추가됨 val은 Kotlin에서 변수를 정의하는 데 선호되는 방법입니다

이 슬라이드에는 몇 가지 다른 구문이 있습니다 새로운 배열리스트를 만들 때 볼 수 있습니다 우리는 새로운 키워드를 부르지 않는다 사실, Kotlin에는 새로운 키워드가 없습니다 클래스를 생성하는 것은 함수를 호출하는 것처럼 보입니다

Kotlin에서, 그리고 이것처럼 보입니다 계속 진행중인 또 다른 일은 질문을 보게 될 것입니다 거기에 표시하십시오 이는 해당 문자열이 null이 될 수 있습니다 Kotlin은 null 가능 유형을 소개합니다

이는 기본적으로 String을 작성한 경우를 의미합니다 물음표 없이는 null이 아닌 문자열이됩니다 그리고 그 문자열은 항상 당신에게 보증 할 수 있습니다 내 코드에서 null이 아니며 널 포인터도 얻지 못한다 예외

그것이 nullable다는 것을 말함으로써, 나는 거기에 null을 저장할 수 있습니다 그리고 내가 역 참조 할 때, 나는 특별한 문법을 ​​사용해야합니다 또는 널 포인터 예외가 발생합니다 내가 이야기하고 싶은 다음 이야기 Kotlin의 데이터 클래스입니다 그것들은 많은 코드를 정의하는 간결한 방법입니다

여기서 내가 정의하는 것은 데이터 클래스 접촉입니다 3 개의 필드가 있습니다 이름, 성 및 이메일이 있습니다 Java 프로그래밍 언어에서 동일한 작업을 수행 할 수 있습니다 나는 String first name, String last name, 및 문자열 전자 메일

그리고 세명의 게터와 세터를 써야합니다 그리고 나서 equals 메서드를 작성해야합니다 그리고 toString 메서드를 작성해야합니다 모든 기능이 자동으로 생성됩니다 나를 위해 데이터 클래스를 사용할 때

이것에 관해 정말로 흥미있는 일부 나는 일반적으로 데이터를위한 클래스 몸체를 제공 할 필요가 없다 수업 내가하고있는 일이 평범한 자바 빈을 정의하는 것이라면 이런 식의 물건, 나 그냥 가면 돼 이름의 값을 선언하십시오 성을 의미하는 불변의 것을 의미합니다

또한 불변 인 것을 의미하고, 그 다음 이메일의 var 그리고 그것은 할당 가능한 필드라는 것을 의미합니다 당신이 바닥에서 보는 것처럼 이메일에 지정할 수 있습니다 이 결론에 대해 생각할 수도 있습니다

나는 현장에 직접 지정하고있다 나는 실제로 세터에게 전화하고있다 그리고 이것은 Kotlin에 대한 멋진 부분입니다 getter와 setter 모두에 대해 암시 적으로 호출되며, C #이나 Swift 같은 언어와 비슷합니다 에서이 구문을 보았습니다

Kotlin에서 흥미로운 한 가지 자바 프로그래밍에 관해서는, 종종 Java에서는 수명주기가 있습니다 Android 라이프 사이클과 관련이 있습니다 따라서 우리는 활동주기가 다릅니다 활동 개체보다 그래서 객체에는 분명히 생성자가 있습니다 그리고 나서 우리는 활동을 시작했습니다

이는 다른 방법입니다 Kotlin은 클래스의 모든 null이 아닌 변수가 필요합니다 constructor의 말미에 의해 초기화된다 예를 들어, 공유 할 때 문제가 될 수 있습니다 생성자가 끝난 후 환경 설정

여기서 우리는 SharedPreferences를 만들 수있는 예제를 볼 수 있습니다 variable null 가능 그리고 우리가 접근 할 때, 우리는 더블 뱅 (double bang)을 사용하거나 확인을 위해 if 체크를해야한다 우리가 액세스 할 때마다, 우리가 널 (null) 변수에 액세스합니다 코 틀린에서 이것을 쓰는 더 좋은 방법은 – 안드로이드에서 우리가 할 일이 많습니다

lateinit을 사용하는 것입니다 그래서 한 lateinit 말한다 – 조금 이상한 구조입니다 그러나 이것이 실제로 의미하는 것은,이 SharedPreferences 내가 액세스 할 때 null이 아니게 될 것입니다 그러나 나는 그것을 끝내겠다고 보장 할 수는 없다 생성자가 끝날 때까지 그래서이 변수에 접근하기 전에 어느 시점에서, 저는 컴파일러에게 약속하지 않을 것입니다

따라서 null 허용 여부 검사를 완화 할 수 있습니다 하지만 그것을 지정하도록 강요하지 않을거야 생성자가 완료되기 전에 해당 필드를 실제로 초기화하지 않은 경우 그것을 액세스하면 다른 런타임 예외가 발생합니다 그래서 그것은 실제로 null 포인터 예외를 만들지 않습니다

여기까지 완전히 가버 리지 만 분명히 문서화되어있다 당신이하려는 일 여기서는 구문에 대한 기본적인 내용을 다루었습니다 코드 랩으로 돌아갈 시간입니다 3 단계를 거치면 방금 전에 말한 몇 가지 단계를 수행하십시오

일부 언어 구문을 사용하십시오 [음악 재생] 그래서 나는 한 쌍의 사람들에게서 한 가지 질문을했다 사실, Kotlin은 실제로 Java로 컴파일하기 전에 바이트 코드로 컴파일합니까? 그리고 답은 Kotlin이 직접 바이트 코드로 컴파일합니다 JVM-6 호환 바이트 코드를 생성하고, 또한 약간의 추가 정보를 추가합니다 바이트 코드로 Kotlin 언어의 일부를 지원한다

구문에 실제로 저장되는 구문 바이트 코드 파일의 헤더에있는 버퍼 따라서 자바에 대한 Kotlin과 같은 바이트 코드는 없습니다 Bytecode에 Kotlin, 바이트 코드에 Java, 그런 다음이 둘을 연결합니다 지금 제가 이야기하고 싶은 것은 Kotlin 뷰 바인딩입니다 Android 확장 플러그인입니다

JetBrains에서 온 것입니다 또한 합성 속성을 사용하여 뷰에 액세스 할 수 있습니다 그래서 우리는 이미 자바에서 이것을하기위한 라이브러리를 가지고 있습니다 프로그래밍 언어 아마 우리 모두는 버터 나이프를 보았을 것입니다

여기서 ID로 찾아보기를 건너 뛸 수 있습니다 이것은 매우 유사한 아이디어입니다 ID로 찾기 창을 건너 뛸 수 있습니다 Kotlin 컴파일러는 컴파일 시간에이를 수행 할 것이며, lazy 할당 및 캐싱을 제공합니다 그래서 저는 앞으로 나아가서 걸어 갈 것입니다

여기 몇 가지 슬라이드에서 뷰 바인딩을 사용하는 방법을 설명합니다 그래서 앱 수준의 Gradle 파일에서 이것들은 4 단계의 단계들입니다 우리는 계속해서 플러그인을 적용합니다 kotlin-android-extensions 그리고 우리가 그것을 할 때, 그것은 가고 있습니다

kotlinx 네임 스페이스에 합성 게터를 생성합니다 그래서 kotlinxandroidsynthetic입니다 그리고 이제 우리는 코드를 작성합니다

mainactivity_contacts가 있습니다 이것이 우리가 정의한 레이아웃 파일입니다 그리고 거기에서 우리는 전망을 얻을 수 있습니다 예를 들어 activity_contacts

xml을 with로 선언 한 경우 플로팅 액션 버튼이 있으며 ID가 있습니다 이것은 꽤 전형적인 코드입니다 수업 시간에 이것을 사용하고 싶을 때, ID로 찾아보기를 사용하는 대신 또는 contacts_activity에 대한 속성을 정의 할 수도 있습니다 나는 그냥 가서 FAB 액세서리를 사용할 수 있습니다 그리고 그것은 종합적으로 추가되었습니다

정적 가져 오기를 수행하면됩니다 ID로 찾기보기를 캐싱 할 것입니다 그래서 내가 FAB에 처음 접근했을 때, 그것을 찾기 위해 뷰 ID를 찾을 것입니다 그리고 나서 나는 그것을 액세스 할 때마다, 같은 인스턴스를 사용합니다 그리고 그것을 해시 맵에 캐시합니다

어제 Kotlin 이야기에서 우리는 많이 이야기했습니다 확장 기능에 대해 그래서 당신이 그것을 보지 못했다면 그것은 YouTube에 올라와 있습니다 어서보세요 오늘, 우리는 우리 자신의 확장의 일부를 정의 할 것입니다

이 코드 랩의 기능 오늘 확장 기능을 활성화하겠습니다 이 고전적인 패턴을 자바에서 보아서 프로그래밍 언어 기본적으로 isTuesday라는 메소드를 추가 할 것입니다 Date 클래스에 추가합니다 그래서 자바에서는 이것을 DateUtils라고 씁니다

우리는 정적 인 방법을 사용합니다 부울을 반환합니다 그것은 화요일이며 유일한 인수로서 날짜를 취합니다 그리고 이것은 멤버 함수처럼 보입니다 당신이 그것에 대해 생각한다면

자바에서 이것을 호출하면 DateUtilsisTuesday, date라고 말하십시오 어색한 구조에 불과합니다 하지만 모든 코드베이스에서 수행 한 작업입니다 그리고 그것은 정말로 잘 작동합니다

따라서 Kotlin은 확장 기능과 확장 기능을 제공합니다 속성을 사용하여 더 나은 구문 지원을 제공합니다 확장 기능은 확장 기능입니다 기존 클래스의 다른 멤버 추가 이미 존재하는 클래스로 마찬가지로, 확장 속성은 getter와 setter를 추가 할 수 있습니다 이미 존재하는 클래스로 여기에서는 정의 및 호출 구문을 볼 수 있습니다

확장 기능 그래서 우리는 함수를 정의하고 있습니다, isTuesday, that Date 클래스의 메서드입니다 그런 다음 인라인 할당을 사용하고 있습니다 to say 하루에 두 번이나 true로 돌아갑니다 형식 유추 때문에 우리는 함수의 반환 유형을 지정해야합니다

그리고 우리가 그것을 부를 때, 우리는 데이트를 말한다 그래서 그것은 클래스의 멤버 메소드처럼 보입니다 그러나 실제로 Date 클래스를 수정하지는 않습니다 따라서 이것이 확장 기능을 이해하는 데 핵심입니다 코 틀린

우리가이 모든 마술을하고있는 것처럼 보입니다 우리는 수업을 열고 방법을 추가하고 있습니다 그러나 우리는 그렇게하지 않습니다 따라서 Date 클래스는 다시 컴파일되지 않습니다 우리는 그것에 방법을 추가하지 않습니다

방금 isTuesday라는 정적 메서드를 정의했습니다 이는 date 매개 변수 인 단일 인수를 취합니다 Kotlin은 약간의 추가 구문을 제공합니다 이런 식으로 부르기 위해서 그래서 우리 코드는 Kotlin에서 이렇게 보입니다

그러나 실제로 우리는 수업을 열지 않았습니다 그리고 그것은 또한 전화가 어떻게 이것에 대한 의미론이 작용합니다 다음으로 얘기하고자하는 것은 람다 표현식입니다 그래서 저는 방금 람다 식을 가지고 있습니다 여기에 화면에

그리고 우리는 구문을 살펴볼 것입니다 읽고 쓰는 법, 쓰는 법 그래서 첫 번째 줄 -이 첫 번째 줄 실제로 자체적으로 모든 것을 컴파일하지는 않지만, 그러나 이야기하는 것이 유용합니다 그것은 람다 식입니다 우리는 외부에 중괄호가 있기 때문에 말할 수 있습니다

가운데에있는 화살 그리고 왼쪽에는 두 개의 인수 a와 b가 있습니다 그리고 오른쪽에는 표현 a plus b가 있습니다 그래서 이것은 두 개의 인수를 취하는 함수입니다 함께 추가합니다

우리가 컴파일하지 않았기 때문에 컴파일되지 않습니다 a와 b에 대한 유형을 제공했습니다 그래서 우리는 다음 라인으로 넘어갈 것입니다 우리는 a를 정수로, b를 정수로 정의했습니다 그래서 우리가 이것에 대해 생각한다면, 우리는 이제 더하기 b라고 말할 수 있습니다

우리는 그 람다의 리턴 타입을 지정할 필요가 없다 Kotlin에서는 정수와 정수가 항상 정수입니다 그런 다음 합계에 할당하고 우리가 유형을 제공 할 필요가없는 것을보십시오, sum은 리터럴 표현식에서 유형을 추론 할 수 있기 때문에 그것은 오른쪽에 있습니다 다음 줄, 세 번째 줄에는 합이 있습니다 여기서 sum 변수 자체에 대한 유형을 정의했습니다

그것은 두 개의 정수를 취하는 모든 함수를 말합니다 정수를 생성합니다 그 문법이 있습니다 괄호 안에는 매개 변수의 유형, 당신은 화살을 넣은 다음 오른쪽에, 함수의 반환 형식을 나열합니다 그런 다음 그것을 객체 리터럴 인 우리의 람다에 할당합니다

우리가 첫 번째 줄에 가지고 있었던 이제 컴파일되는 것을 볼 수 있습니다 타입 유추를 사용할 수 있기 때문에 그 유형을 통해 오른쪽에 매개 변수를 정수 및 정수로 정의했습니다 그리고 이제 a는 정수입니다 왜냐하면 우리는 그것이 있어야하는 맥락에서 그것을 사용했다

그리고 b는 정수입니다 왜냐하면 우리는 그것이 있어야하는 맥락에서 그것을 사용했다 그리고 다시, 우리는 여전히 돌아갈 필요가 없습니다 – 람다의 반환 유형을 말할 필요가 없습니다 그리고 마지막 줄에서 조금 더 보여줍니다 실용적인 람다의 값 notEmpty

따라서 텍스트 뷰를 사용하고 Boolean을 반환합니다 그리고 이것은 흥미로운 부분을 보여줍니다 Kotlin에서 람다 구문의 그래서이 경우에는 실제로는 아니에요 화살표 구문을 제공하거나 매개 변수의 이름을 지정합니다

하나의 매개 변수 λ에 대한 값을이 매개 변수라고합니다 그건 기본적으로입니다 항상 이름을 바꿀 수 있습니다 하지만이 경우에는 그냥 그대로 두겠습니다 그래서, 우리는 it

textisNotEmpty라고 말합니다 그래서 우리가 시작할 때 정말 빛나는 곳입니다 익명의 내부 클래스를 수행합니다 그래서 우리는 자바 프로그래밍 언어로 항상 이것을합니다

우리는 setOnClickListener를합니다 그리고 그 모든 것을 읽으면 매우 길어질 것입니다 그러나 결국에는 onClick 메서드를 재정의합니다 그리고 여기에 쓰고있는 유일한 실제 코드 performAction입니다 그 밖의 모든 것은 실제로 코드가 아닙니다

그것은 나를 위해 생성하는 IDE를 가져야 만하는 물건입니다 그래서 내가 쓰려고하는 코드를 작성할 수 있습니다 Kotlin에서는 람다를 사용하여 말하려고했다 이것이 우리가 할 수있는 일입니다 우리는 fab

setOnClickLIstener, 그리고 나서 우리는 문자 그대로 우리가 말하려고했던 코드를 작성합니다 우리는 그 여분의 것들을 모두 제거 할 수 있습니다 그리고 주변에 머물러 있습니다 형식 유추를 계속 사용합니다 훨씬 더 간결하며 Java 8과 매우 비슷합니다

람다 구문 람다가 정말 강력 해지는 곳 우리가 그들을 더 높은 순서대로 사용하기 시작할 때입니다 우리는 이미 이것의 예를 보았습니다 하지만 다른 함수를 사용하는 함수입니다 그것의 논증으로

그리고 이것은 여러분이 할 수있는 것입니다 Kotlin을 사용하여 코드를 매우 멋지게 만드십시오 읽기 쉽고 매우 표현적입니다 따라서 고차 함수의 고전적인 예 1970 년부터는 필터 방법이 있습니다 따라서 필터 메서드는 목록에 대해 작동합니다

그래서 당신은 목록을 가지고 있습니다 당신은 술어를줍니다 그리고 술어가 사실 일 때마다, 값을 포함하는 새 목록을 생성합니다 필터가 참인 곳 이제이 선언문을 읽으십시오

Kotlin 구문이 많이 표시되기 때문입니다 그래서 그것은 기능입니다 그것은 일반적인 유형 T를 가지고 있으며, 그것은 T의 목록에 대한 확장입니다 그리고 이것은 흥미로운 일입니다 왜냐하면 당신이 정의 할 수 있기 때문입니다

제네릭 형식의 확장 이것은 정말로, 정말로 할 수있는 일입니다 영리한 물건 T 물음표로 정의 할 수도 있습니다 내가 T에 확장을 정의하고 싶다

또는 T의 널값 그런 다음 filter라는 함수를 정의 할 것입니다 하나의 술어를 취합니다 그리고 나서 우리는 그것이 T 형의 1 개의 인수를 취하는 함수 부울을 반환합니다 그리고 마지막으로, 물론, 우리의 기능 T의 목록을 반환합니다

그리고 함수 안에서, 새 배열 목록을 만듭니다 그리고 항목에 대한 술어를 호출합니다 술어가 참일 때마다 새 목록에 추가합니다 그런 다음 새 목록을 반환합니다 그래서 우리가 앞서 가서 이것을 사용하려고 시도한다면, we''d는 listOf를 말한다

그것은 Kotlin의 길이다 정적 목록, 애플, 오렌지, 셀러리, 당근을 선언합니다 그리고 나서 우리는 바구니에 넣을거야 여과기 다시 말하지만, 코드를 단축하는 데 사용합니다

첫 번째 문자가 C이면 우리는 그냥 셀러리와 당근 목록을 생성하려고합니다 특히 그렇게 강하지는 않습니다 우리 모두가 루프를 쓸 수 있다고 생각해 앞으로 나아가서 우리 스스로 할 수 있습니다 그러나 우리는 훨씬 더 표현적인 것을 쓸 수 있습니다

우리가 이와 같은 보편적 인 코드를 시작할 때 이것은 데이터베이스 트랜잭션을 수행하는 방법의 예입니다 [? 방 ?] 거래를 시작해야합니다 실제 데이터베이스를 호출해야합니다

당신이하고 싶은 기능, 그리고 당신 끝내야 해 거래 그리고 당신이 그것을 더 잘하고 싶다면, 당신은 beginTransaction, call을해야합니다 당신이하고 싶은 함수, setTransactionSuccessful, 그런 다음 거래를 끝내십시오 다시 한번, onClickListener와 마찬가지로, 실제로 여기에는 실제 코드가 한 줄만 있습니다

그 밖의 모든 것들은 내가 방금하는 물건입니다 타이핑 및 / 또는 다른 수단을 통한 생성 자바 프로그래밍 언어가 작동하는 방식 때문에, 이것을 단순화하고 그것을 돌리기는 어렵다 추상화 하지만 Kotlin에서 우리는 실제로 꽤 잘 갈 수 있습니다

꽤 멀리 그래서 Kotlin에서 우리는 SQLite 데이터베이스 endTransaction을 할 수 있습니다 그래서 우리는 확장 함수를 할 것입니다 우리 데이터베이스에 그리고 우리는 그 모든 보일러 판을 정확히 놓을 것입니다

같은 방식으로 그래서 beginTransaction, setTransactionSuccessful, 및 endTransaction 하지만 우리는 그 모든 것을 쓰지 않고 우리가 작성하려고하는 모든 코드 라인을 중심으로, 우리는 코드 줄을 지나갈 것입니다 함수 인수에서 람다 (lambda)로 따라서 함수 – 인자를 취하지 않는 함수 값을 반환하지 않습니다

그래서 우리가 그것을 사용할 때, 이것처럼 보입니다, 그렇죠? 그래서 우리는 dbinTransaction을 말하고 우리는 람다를 전달합니다 그리고 나서 우리는 실제로 우리가 작성한 코드만을 씁니다 쓰기를 시도합니다 자, 이건 좀 이상해

우리가 우리의 람다 내부에서 데이터베이스에 액세스 그리고 lambda는 함수 리터럴입니다 그래서 그것에 대해 생각한다면 그것은 의미합니다 나는 끝내기 위해 폐쇄를해야 할 것입니다 해당 데이터베이스 변수

우리가 할 수있는 또 다른 방법은 함수에 데이터베이스를 전달할 수 있습니다 이 경우 함수를 SQLite로 정의합니다 SQLite 데이터베이스를 사용하고 아무 것도 반환하지 않는 함수 그래서 우리가 그렇게한다면 그것은 이렇게 보일 것입니다 db

inTransaction, itdelete 괜찮아요하지만 그건 나는 아직도 조금 이상하다고 생각한다 우리는 더 잘 할 수 있습니다 함수를 정의하는 바로이 구문 우리가 확장 람다라고 부르는 것입니다 확장 기능으로 작동하는 부동 함수입니다 기능

이렇게하면 확장 기능을 호출 할 수 있습니다 SQLite 데이터베이스 유형의 모든 객체에서 이 경우 암시적인 this를 사용합니다 우리의 확장 함수에서 thisfunc를 호출하십시오

그런 다음 다른 코드에서 dbinTransaction이라고 말할 수 있습니다 이제 데이터베이스에서 함수를 호출 할 수 있습니다 나는 그것을 사용하고 싶었다 도메인 별 언어의 시작 부분이 생성됩니다

Kotlin에서는 매우 강력합니다 코드에 대해 언급하고 싶은 것이 있습니다 그래도 우리는 여기에있다 이 코드를 컴파일하면 어떻게 될까요? 그런 다음 디 컴파일하십시오 우리는 이것으로 끝난다

그리고 조금 더러워 보이지만, 정말 중요한 것은 inTransaction을 호출 할 때입니다 새로운 함수 객체를 생성하고, 왜냐하면 매번 인수를 포착해야하기 때문입니다 Kotlin에서 함수를 작성할 때 당신은 람다 (lambda)를 취하는 고성능이 될 것이라고 생각합니다 인라인 키워드를 사용해야합니다 따라서 인라인 키워드를 사용할 수 있습니다

지정시 수행 할 작업 인라인은 실제로 소스 코드를 수행합니다 당신이 그 기능을 부를 때마다 이렇게하면 인라인과는 많이 다른 것입니다 C ++와 같은 다른 언어에서 익숙하다 Kotlin에서 인라인 함수를 호출하면 보장됩니다 – 그것은 힌트와 같지 않다 문자 적 요구 사항입니다

당신은 당신의 기능이 보장됩니다 인라인 함수의 본문 전화 사이트에서 제자리에 떨어 뜨리다 해당 인라인 함수를 호출 할 때마다 자, 이제 코드 랩을 끝내자 그래서 당신이 남긴 모든 조치 그리고 나는 모두에게 물어보고 싶었다

전에 3-5 분 정도 걸릴거야 이 파란색 탭의 피드백 양식을 여기에 작성하십시오 우리는 여러분이 코 틀린에 대해 어떻게 생각하는지 알고 싶습니다 우리가 앞으로 나아갈 것을보고 싶은 곳 그리고 Kotlin 사례 연구에 관심이 있다면, 가서 나하고 말해

나는 걸어 다닐거야 고맙습니다 [박수 갈채] [음악 재생]