출처: http://november11tech.tistory.com/88 [Mr.november11] '개발/JAVA' 카테고리의 글 목록 :: 사월은 봄이다.

나의 네이버 

http://napsis.blog.me/221471975802



currencyId 예) USD, CNY

currencySign : $ ,

public String getCurrencySignByCurrencyId(String currencId) {
Locale locale = null; String currencySign = "";
for (Locale l : Locale.getAvailableLocales()) {
if (l.getCountry().length() == 2) {
String code = Currency.getInstance(l).getCurrencyCode();
if (currencId.equals(code)) {
locale = l; break;
}
}
}
if (locale == null) {
log.warn("Invalid currencyId. Requested currendId:" + currencId);
currencySign = currencId;
} else {
currencySign = Currency.getInstance(locale).getSymbol(locale);
}
return currencySign;
}

public String getCurrencySignByCurrencyId(String currencId) {
Locale locale = null; String currencySign = "";
for (Locale l : NumberFormat.getAvailableLocales()) {
String code = Currency.getInstance(l).getCurrencyCode();
if (currencId.equals(code)) {
locale = l; break;
}
}
if (locale == null) {
log.warn("Invalid currencyId. Requested currendId:" + currencId); currencySign = currencId;
} else {
currencySign = Currency.getInstance(locale).getSymbol(locale);
}
return currencySign;
}

아래쪽의 경우, 길이체크를 하지 않아도 된다.

왜지?

안에 들어있는 내용을 찍어봤을 때 다 같았는데 차이점을 잘 모르겠음



'개발 > JAVA' 카테고리의 다른 글

google sheet + java + maven  (0) 2019.02.10
Comparator 간단하게 이용하기  (0) 2019.02.05
NullPointerException  (0) 2018.12.24
Java8 함수형  (0) 2018.09.19
Math.random()  (0) 2018.08.07

My naver : https://blog.naver.com/napsis/221462366927

구글 시트를 읽어와야 했다...

후....... 왜 이리 자료가 없노.. 왠지 나중에 또 쓸 수 있으므로...

https://developers.google.com/sheets/api/quickstart/java

여길 보면 퀵 스타트 페이지가 있다. 따라하면 되는데, 구글 sheet api를 발급받아야 한다.

https://console.developers.google.com/flows/enableapi?apiid=sheets.googleapis.com

요기서 하면 된다.











이렇게 발급받는다. 검색해보면 더 자세히 설명해준 사이트도 많음

본격적으로.... 내가 삽질한 부분에 대해 이야기 해 보자면

maven.... 이 생퀴....

계속 import가 안돼서 다른 블로그에서 주로 하는대로 gradle로 하니까 되길래 직접 라이브러리들 비교해서 적어줬다. 그래서 결국...

<!-- google-->
<dependency>
<groupId>com.google.api-client</groupId>
<artifactId>google-api-client</artifactId>
<version>1.23.0</version>
</dependency>

<!-- https://mvnrepository.com/artifact/com.google.oauth-client/google-oauth-client-jetty -->
<dependency>
<groupId>com.google.oauth-client</groupId>
<artifactId>google-oauth-client-jetty</artifactId>
<version>1.23.0</version>
</dependency>

<!-- https://mvnrepository.com/artifact/com.google.apis/google-api-services-sheets -->
<dependency>
<groupId>com.google.apis</groupId>
<artifactId>google-api-services-sheets</artifactId>
<version>v4-rev516-1.23.0</version>
</dependency>


<!-- https://mvnrepository.com/artifact/jetty/org.mortbay.jetty -->
<!-- https://mvnrepository.com/artifact/jetty/org.mortbay.jetty -->
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty</artifactId>
<version>6.1.26</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mortbay.jetty/jetty-util -->
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-util</artifactId>
<version>6.1.26</version>
</dependency>

<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5-20081211</version>
</dependency>

<!-- google-->

이걸 다 적어줌... 원래 다른 곳에서는 3개만 디펜던시 걸어주니까 다 알아서 해주던데..... 그냥 내 메이븐이 멍청했던 걸로하자...

gradle의 경우 maven central에서 직접 가지고 오기 때문... 이라고 한다....ㅂㄷㅂㄷ

이제 자바 코드

보면 아까 sheet api를 발급 받을 때 리턴 사이트 주소를 적어줘야 하는데 나 같은 경우는 단순하게

"http://localhost:8080"

라고만 적어줬다가 계속 400이 떴다.

그러다가 밑에 detail 누르니까

http://localhost:8080/Callback

라고 있길래 저래 바꿔주니까 됐음......... 뭐지.... 나만 왜....

암튼 자바 코드를 보면,





import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp;
import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver;
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.client.util.store.FileDataStoreFactory;
import com.google.api.services.sheets.v4.Sheets;
import com.google.api.services.sheets.v4.SheetsScopes;
import com.google.api.services.sheets.v4.model.ValueRange;
import com.nsuslab.dionysos.promotion.domain.AuthType;
import com.nsuslab.dionysos.promotionPayment.domain.GoogleSheetForm;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Arrays;

import java.util.List;

일단 import 되는건 이정도다.

@RestController
public class PromotionPaymentController {
// OAUTH 2.0 연동시 지정한 OAuth 2.0 클라이언트 이름
private static final String APPLICATION_NAME = "application_name";

// OAUTH 2.0 연동시 credential을 디스크에 저장할 위치
private static final java.io.File DATA_STORE_DIR = new java.io.File(System.getProperty("user.home"), ".credentials/sheets.googleapis.com-java-quickstart");

// Global instance of the {@link FileDataStoreFactory}.
private static FileDataStoreFactory DATA_STORE_FACTORY;

// Global instance of the JSON factory.
private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();

// Global instance of the HTTP transport.
private static HttpTransport HTTP_TRANSPORT;

// Google Sheet API 권한을 SCOPE로 지정
private static final List<String> SCOPES = Arrays.asList(SheetsScopes.SPREADSHEETS);

// OAUTH 2.0 연동시 사용될 callback용 local receiver 포트 지정
private static final int LOCAL_SERVER_RECEIVER_PORT = 8080;

// HTTP_TRANSPORT, DATA_STORE_FACTORY 초기화
static {
try {
HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR);
} catch (Throwable t) {
t.printStackTrace();
System.exit(1);
}
}

// OAUTH 2.0용 credential
public static Credential getOauth2Authorize() throws IOException {
// OAUTH 2.0용 secret josn 로드
InputStream in = PromotionPaymentController.class.getResourceAsStream("/client_secret.json");
GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));

GoogleAuthorizationCodeFlow flow =
new GoogleAuthorizationCodeFlow.Builder(
HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES)
.setDataStoreFactory(DATA_STORE_FACTORY)
.setAccessType("offline")
.build();

LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(LOCAL_SERVER_RECEIVER_PORT).build();

Credential credential = new AuthorizationCodeInstalledApp(flow, receiver).authorize("user");
System.out.println("Credentials saved to " + DATA_STORE_DIR.getAbsolutePath());
return credential;
}

public static Sheets getSheetsService(AuthType authMode) throws IOException {
Credential credential = null;
if (authMode == AuthType.OAUTH20) {
credential = getOauth2Authorize();
}
return new Sheets.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)
.setApplicationName(APPLICATION_NAME)
.build();
}

@PostMapping("/api/google/sheet")
public ResponseEntity RewardPromotions(@RequestBody GoogleSheetForm.Request request) throws IOException {
Sheets service = getSheetsService(AuthType.OAUTH20);
ValueRange response = service.spreadsheets().values()
.get(request.getSpreadSheetId(), request.getRange()).setMajorDimension("ROWS")
.execute();
List<List<Object>> values = response.getValues();
System.out.println(response.getValues().toString());
if (values == null || values.size() == 0) {
System.out.println("No data found.");
} else {
for (List row : values) {
if (row.size() > 0) {
System.out.println(row.get(0).toString());
}
}
}
return new ResponseEntity(HttpStatus.OK);
}

}

public enum AuthType {
OAUTH20
}

간단히 이정도인데 oauth2.0만 했음...

여기서 인증정보를 가진 client_secret.json은 resource 밑에 넣어둔다.









그리고 대충 이런느낌으로 생겼음





이렇게 나온다.

result






참고하면 좋을 사이트들...

https://developers.google.com/sheets/api/samples/reading?hl=ko

만약 기존 oath 키 없애고 새로 발급 받았다면, .credenctial에 저장한 sheets.googleapis.com-java-quickstart 를 삭제한다.

안그러면 401 뜸..










'개발 > JAVA' 카테고리의 다른 글

curreny sign 가져오기  (0) 2019.02.22
Comparator 간단하게 이용하기  (0) 2019.02.05
NullPointerException  (0) 2018.12.24
Java8 함수형  (0) 2018.09.19
Math.random()  (0) 2018.08.07
@Test public void testComparator(){ List<Integer> lists = new ArrayList<>(); for(int i = 0 ; i < 10 ; i++){ lists.add((int)(Math.random()*100+i)); } lists.forEach(r->{System.out.print(r+",");}); System.out.println("====="); lists.sort(new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o1.compareTo(o2); } }); lists.forEach(r->{System.out.print(r+",");}); System.out.println("-------"); }

<결과>

89,82,19,35,52,18,16,16,70,104,=====

16,16,18,19,35,52,70,82,89,104,-------

​http://napsis.blog.me/221458894824


'개발 > JAVA' 카테고리의 다른 글

curreny sign 가져오기  (0) 2019.02.22
google sheet + java + maven  (0) 2019.02.10
NullPointerException  (0) 2018.12.24
Java8 함수형  (0) 2018.09.19
Math.random()  (0) 2018.08.07

[env] spring-boot

잘 되다가 갑자기 NullPointerException에 시달렸다.


[ip-172-31-58-193] 2018:12:24 01:01:09.933 ERROR --- [http-nio-8080-exec-1] o.s.b.web.support.ErrorPageFilter : Forwarding to error page from request [/api/aaaaa/bbbbb/ccccc/ddddd/eeeeee/fff] due to exception [null]

[ip-172-31-58-193] java.lang.NullPointerException: null

[ip-172-31-58-193]      at org.springframework.validation.beanvalidation.SpringValidatorAdapter.processConstraintViolations(SpringValidatorAdapter.java:123)

[ip-172-31-58-193]      at org.springframework.validation.beanvalidation.SpringValidatorAdapter.validate(SpringValidatorAdapter.java:94)

[ip-172-31-58-193]      at com.test.common.engine.validator.CollectionValidator.validate(CollectionValidator.java:35)

[ip-172-31-58-193]      at com.test.common.engine.aop.ValidHandler.valid(ValidHandler.java:72)

[ip-172-31-58-193]      at sun.reflect.GeneratedMethodAccessor258.invoke(Unknown Source)

[ip-172-31-58-193]      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

[ip-172-31-58-193]      at java.lang.reflect.Method.invoke(Method.java:498)

[ip-172-31-58-193]      at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:629)

[ip-172-31-58-193]      at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:618)

[ip-172-31-58-193]      at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)

[ip-172-31-58-193]      at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)

[ip-172-31-58-193]      at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)

[ip-172-31-58-193]      at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)

[ip-172-31-58-193]      at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:656)

[ip-172-31-58-193]      at com.test.my.promotion.controller.PromotionRakebackAchievementController$$EnhancerBySpringCGLIB$$4ccc77c2.setPromotionRakebackAchievementOptedIn(<generated>)

[ip-172-31-58-193]      at sun.reflect.GeneratedMethodAccessor516.invoke(Unknown Source)

[ip-172-31-58-193]      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

[ip-172-31-58-193]      at java.lang.reflect.Method.invoke(Method.java:498)

[ip-172-31-58-193]      at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:220)

[ip-172-31-58-193]      at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:134)

[ip-172-31-58-193]      at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:116)

[ip-172-31-58-193]      at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)

[ip-172-31-58-193]      at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)

[ip-172-31-58-193]      at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)

[ip-172-31-58-193]      at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)

[ip-172-31-58-193]      at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897)

[ip-172-31-58-193]      at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)

[ip-172-31-58-193]      at org.springframework.web.servlet.FrameworkServlet.doPut(FrameworkServlet.java:883)

[ip-172-31-58-193]      at javax.servlet.http.HttpServlet.service(HttpServlet.java:664)

[ip-172-31-58-193]      at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)

[ip-172-31-58-193]      at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)

[ip-172-31-58-193]      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230)

[ip-172-31-58-193]      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)

[ip-172-31-58-193]      at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

[ip-172-31-58-193]      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)

[ip-172-31-58-193]      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)

[ip-172-31-58-193]      at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)

[ip-172-31-58-193]      at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

[ip-172-31-58-193]      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)

[ip-172-31-58-193]      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)

[ip-172-31-58-193]      at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:89)

[ip-172-31-58-193]      at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

[ip-172-31-58-193]      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)

[ip-172-31-58-193]      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)

[ip-172-31-58-193]      at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77)

[ip-172-31-58-193]      at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

[ip-172-31-58-193]      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)

[ip-172-31-58-193]      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)

[ip-172-31-58-193]      at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)

[ip-172-31-58-193]      at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

[ip-172-31-58-193]      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)

[ip-172-31-58-193]      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)

[ip-172-31-58-193]      at org.springframework.boot.web.support.ErrorPageFilter.doFilter(ErrorPageFilter.java:117)

[ip-172-31-58-193]      at org.springframework.boot.web.support.ErrorPageFilter.access$000(ErrorPageFilter.java:61)

[ip-172-31-58-193]      at org.springframework.boot.web.support.ErrorPageFilter$1.doFilterInternal(ErrorPageFilter.java:92)

[ip-172-31-58-193]      at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

[ip-172-31-58-193]      at org.springframework.boot.web.support.ErrorPageFilter.doFilter(ErrorPageFilter.java:110)

[ip-172-31-58-193]      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)

[ip-172-31-58-193]      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)

[ip-172-31-58-193]      at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)

[ip-172-31-58-193]      at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)

[ip-172-31-58-193]      at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478)

[ip-172-31-58-193]      at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)

[ip-172-31-58-193]      at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80)

[ip-172-31-58-193]      at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:624)

[ip-172-31-58-193]      at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)

[ip-172-31-58-193]      at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:341)

[ip-172-31-58-193]      at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799)

[ip-172-31-58-193]      at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)

[ip-172-31-58-193]      at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861)

[ip-172-31-58-193]      at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455)

[ip-172-31-58-193]      at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)

[ip-172-31-58-193]      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)

[ip-172-31-58-193]      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)

[ip-172-31-58-193]      at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)

[ip-172-31-58-193]      at java.lang.Thread.run(Thread.java:745) 


아무런 정보 없이 계속 생겼고 소스를 확인해 보았다.

Request Body Parameters

 @Data

@ApiModel(value = "TestRakebackAchievementForm.OptedIn")

public static class OptedIn {
private String playerId;

@NotNull
private BigDecimal completeAmount;

private BigDecimal stepAmount;

@Digits(integer = 10, fraction = 2)
private BigDecimal bonusAmount;

private Integer expiryDays;

}


원인 @Digits(integer = 10, fraction = 2)

해당 설정보다 큰 숫자가 들어와서 생긴 오류였다.

저걸 지워주니 잘 됐음..왜지...

http://napsis.blog.me/221426306023

'개발 > JAVA' 카테고리의 다른 글

google sheet + java + maven  (0) 2019.02.10
Comparator 간단하게 이용하기  (0) 2019.02.05
Java8 함수형  (0) 2018.09.19
Math.random()  (0) 2018.08.07
null 대신 Optional  (0) 2018.07.07
List numbers = ArrayList.asList(10,12, 11, 13);

String result = numbers.stream().map(String::valueOf).collect(joining(":"));

여기서 map(String::valueOf) 가 있다. 

map이 key, value로 만드는 그런것이 아니라, numbers의 타입인 Integer를 String으로 매핑한다는 소리다. 
String.valueOf(Integer) 이 말임. 

 그리고 joining이라고 10:12:11 이런식의 녀석인데 이건 나중에...



'개발 > JAVA' 카테고리의 다른 글

Comparator 간단하게 이용하기  (0) 2019.02.05
NullPointerException  (0) 2018.12.24
Math.random()  (0) 2018.08.07
null 대신 Optional  (0) 2018.07.07
assertThat 사용  (0) 2018.06.04
0에서 100 사이의 수 : (int)Math.random()*100 


'개발 > JAVA' 카테고리의 다른 글

NullPointerException  (0) 2018.12.24
Java8 함수형  (0) 2018.09.19
null 대신 Optional  (0) 2018.07.07
assertThat 사용  (0) 2018.06.04
BigDecimal 사용법  (0) 2018.06.03

Null  때문에 발생하는 문제

1. 에러의 근원

NullPointException이 자주 발생한다..


2. 코드를 어지럽힌다.

중첩된 null 확인 코드로 인해 가독성이 떨어진다.


3. 아무 의미가 없다.

null은 아무 의미도 없다. 특히 정적 형식 언어에서 값이 없음을 표현하는 방법으로는 적절하지 않다.


4. 자바철할에 위배

자바는 포인터를 숨겼다. 하지만 null은 포인터다. ㅠ


5. 형식 시스템에 구멍을 만든다.

null은 무형식이며 정보를 포함하지 않으므로 모든 레퍼런스 형식에 null을 할당할 수 있다.


JAVA8에선 Optional이라는 클래스를 제공한다.

메서드 

설명 

 empty

 빈 Optional 인스턴스 반환

 filter

 값이 존재하며 프레디케이트와 일치하면 값을 포함하는 Optional을 반환하고, 값이 없거나 프레디케이트와 일치하지 않으면 빈 Optional을 반환

 flatMap

값이 존재하면 인수로 제공된 함수를 적용한 결과 Optional을 반환하고, 값이 없으면 빈 Optional을 반환 

 get

값이 존재하면 Optional이 감싸고 있는 값을 반환, 없으면 NoSuchElementExeption 발생 

 ifPresent

값이 존재하면 지정된 Consumer를 실행, 없으면 아무 일도 일어나지 않음 

 isPresent

값이 존재하면 True, 없으면 False 

 map

 값이 존재하면 제공된 매핑함수를 적용

 of

값이 존재하면 값을 감싸는 Optional을 반환, 값이 Null이면  NullPointException 발생

 ofNullable

값이 존재하면 값을 감싸는  Optional을 반환, 값이 Null이면 빈 Optional을 반환

 orElse

 값이 존재하면 값을 반환, 없으면 디폴트 값을 반환

 orElseGet

 값이 존재하면 값을 반환, 없으면 Supplier에서 제공하는 값 반환

 orElseThrow

값이 존재하면 값을 반환, 없으면 Supplier에서 생성한 예외 발생 





'개발 > JAVA' 카테고리의 다른 글

Java8 함수형  (0) 2018.09.19
Math.random()  (0) 2018.08.07
assertThat 사용  (0) 2018.06.04
BigDecimal 사용법  (0) 2018.06.03
string.join 사용기  (0) 2018.05.14

assertThat

1. String 일 때,

assertThat("Hello, world!") 



.isNotEmpty() // 비어있지 않음

.contains("Nice") // "Nice" 포함

.doesNotContain("ㅁㅁㅁ") // "ㅁㅁㅁ"는 포함하지 않음

.startsWith("He") // "He" 시작하는 가?

.endsWith("!") // "!" 끝난다.

.isEqualTo("Hello, world! ^^.");  // "Hello, world! ^^."와 같다.





2. 숫자일 때,


assertThat(10.02d) 

.isPositive() // 양수

.isGreaterThan(1) // 3보다 크냐?

.isLessThan(2) // 4보다 작냐?

.isEqualTo(10, offset(1d)) // 오프셋 1 기준으로 10 같음?

.isEqualTo(10.0, offset(0.1d)) // 오프셋 0.1 기준으로10.0과 같음?

.isEqualTo(10.02); // 오프셋 없이는 10.02 같음?

'개발 > JAVA' 카테고리의 다른 글

Math.random()  (0) 2018.08.07
null 대신 Optional  (0) 2018.07.07
BigDecimal 사용법  (0) 2018.06.03
string.join 사용기  (0) 2018.05.14
자바 스트림, Stream  (0) 2018.03.30

1. Init

BigDecimal big = new BigDecimal(33);


2. compare

big.compareTo(BigDecimal.ZERO);


( < , > 등으로는 비교할 수 없다.)

만약 true 면 return 1;

false 면 return -1;


또는 equals로 비교한다.

참고로 equals는 true/false로 리턴됨


곱하기

.multiply();


나누기, 반올림해서 소수점 둘쨰짜리까지

.divide(나눌 수, 2, BigDecimal.ROUND_UP);


.빼기

.subtract();


더하기

.add() ;


'개발 > JAVA' 카테고리의 다른 글

null 대신 Optional  (0) 2018.07.07
assertThat 사용  (0) 2018.06.04
string.join 사용기  (0) 2018.05.14
자바 스트림, Stream  (0) 2018.03.30
정수를 2진수로  (0) 2018.03.20


구분자를 넣어준다.


String.join( "-", "a", "b","c");


-> a-b-c


이때 array, list 도 같은 결과를 리턴해줌...신기하군.

'개발 > JAVA' 카테고리의 다른 글

assertThat 사용  (0) 2018.06.04
BigDecimal 사용법  (0) 2018.06.03
자바 스트림, Stream  (0) 2018.03.30
정수를 2진수로  (0) 2018.03.20
역삼각형 출력하기  (0) 2018.03.19

+ Recent posts