diff --git a/FAQ 2019-03/jpa-demo/.gitignore b/FAQ 2019-03/jpa-demo/.gitignore
new file mode 100644
index 0000000..c456c4a
--- /dev/null
+++ b/FAQ 2019-03/jpa-demo/.gitignore
@@ -0,0 +1,25 @@
+/target/
+!.mvn/wrapper/maven-wrapper.jar
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+/build/
diff --git a/FAQ 2019-03/jpa-demo/pom.xml b/FAQ 2019-03/jpa-demo/pom.xml
new file mode 100644
index 0000000..8a0fdb8
--- /dev/null
+++ b/FAQ 2019-03/jpa-demo/pom.xml
@@ -0,0 +1,64 @@
+
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.1.2.RELEASE
+
+
+ geektime.spring.springbucks
+ jpa-demo
+ 0.0.1-SNAPSHOT
+ jpa-demo
+ Demo project for Spring Boot
+
+
+ 1.8
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+
+ org.joda
+ joda-money
+ 1.0.1
+
+
+ org.jadira.usertype
+ usertype.core
+ 6.0.1.GA
+
+
+
+ mysql
+ mysql-connector-java
+
+
+
+ org.projectlombok
+ lombok
+ true
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
diff --git a/FAQ 2019-03/jpa-demo/src/main/java/geektime/spring/springbucks/jpademo/JpaDemoApplication.java b/FAQ 2019-03/jpa-demo/src/main/java/geektime/spring/springbucks/jpademo/JpaDemoApplication.java
new file mode 100644
index 0000000..d9021fd
--- /dev/null
+++ b/FAQ 2019-03/jpa-demo/src/main/java/geektime/spring/springbucks/jpademo/JpaDemoApplication.java
@@ -0,0 +1,61 @@
+package geektime.spring.springbucks.jpademo;
+
+import geektime.spring.springbucks.jpademo.model.Coffee;
+import geektime.spring.springbucks.jpademo.model.CoffeeOrder;
+import geektime.spring.springbucks.jpademo.repository.CoffeeOrderRepository;
+import geektime.spring.springbucks.jpademo.repository.CoffeeRepository;
+import lombok.extern.slf4j.Slf4j;
+import org.joda.money.CurrencyUnit;
+import org.joda.money.Money;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+
+import java.util.Arrays;
+
+@SpringBootApplication
+@EnableJpaRepositories
+@Slf4j
+public class JpaDemoApplication implements ApplicationRunner {
+ @Autowired
+ private CoffeeRepository coffeeRepository;
+ @Autowired
+ private CoffeeOrderRepository orderRepository;
+
+ public static void main(String[] args) {
+ SpringApplication.run(JpaDemoApplication.class, args);
+ }
+
+ @Override
+ public void run(ApplicationArguments args) throws Exception {
+ initOrders();
+ }
+
+ private void initOrders() {
+ Coffee espresso = Coffee.builder().name("espresso")
+ .price(Money.of(CurrencyUnit.of("CNY"), 20.0))
+ .build();
+ coffeeRepository.save(espresso);
+ log.info("Coffee: {}", espresso);
+
+ Coffee latte = Coffee.builder().name("latte")
+ .price(Money.of(CurrencyUnit.of("CNY"), 30.0))
+ .build();
+ coffeeRepository.save(latte);
+ log.info("Coffee: {}", latte);
+
+ log.info("Total Coffee: {}", coffeeRepository.count());
+
+ CoffeeOrder order = CoffeeOrder.builder()
+ .customer("Li Lei")
+ .items(Arrays.asList(espresso, latte))
+ .state(0)
+ .build();
+ orderRepository.save(order);
+ log.info("Order: {}", order);
+ }
+}
+
diff --git a/FAQ 2019-03/jpa-demo/src/main/java/geektime/spring/springbucks/jpademo/model/Coffee.java b/FAQ 2019-03/jpa-demo/src/main/java/geektime/spring/springbucks/jpademo/model/Coffee.java
new file mode 100644
index 0000000..c5fcf89
--- /dev/null
+++ b/FAQ 2019-03/jpa-demo/src/main/java/geektime/spring/springbucks/jpademo/model/Coffee.java
@@ -0,0 +1,41 @@
+package geektime.spring.springbucks.jpademo.model;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.hibernate.annotations.CreationTimestamp;
+import org.hibernate.annotations.Type;
+import org.hibernate.annotations.UpdateTimestamp;
+import org.joda.money.Money;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import java.io.Serializable;
+import java.util.Date;
+
+@Entity
+@Table(name = "T_MENU")
+@Builder
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class Coffee implements Serializable {
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+ private String name;
+ @Column
+ @Type(type = "org.jadira.usertype.moneyandcurrency.joda.PersistentMoneyMinorAmount",
+ parameters = {@org.hibernate.annotations.Parameter(name = "currencyCode", value = "CNY")})
+ private Money price;
+ @Column(updatable = false)
+ @CreationTimestamp
+ private Date createTime;
+ @UpdateTimestamp
+ private Date updateTime;
+}
diff --git a/FAQ 2019-03/jpa-demo/src/main/java/geektime/spring/springbucks/jpademo/model/CoffeeOrder.java b/FAQ 2019-03/jpa-demo/src/main/java/geektime/spring/springbucks/jpademo/model/CoffeeOrder.java
new file mode 100644
index 0000000..db40986
--- /dev/null
+++ b/FAQ 2019-03/jpa-demo/src/main/java/geektime/spring/springbucks/jpademo/model/CoffeeOrder.java
@@ -0,0 +1,44 @@
+package geektime.spring.springbucks.jpademo.model;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.hibernate.annotations.CreationTimestamp;
+import org.hibernate.annotations.UpdateTimestamp;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinTable;
+import javax.persistence.ManyToMany;
+import javax.persistence.Table;
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+@Entity
+@Table(name = "T_ORDER")
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class CoffeeOrder implements Serializable {
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+ private String customer;
+ @ManyToMany
+ @JoinTable(name = "T_ORDER_COFFEE")
+ private List items;
+ @Column(nullable = false)
+ private Integer state;
+ @Column(updatable = false)
+ @CreationTimestamp
+ private Date createTime;
+ @UpdateTimestamp
+ private Date updateTime;
+}
+
diff --git a/FAQ 2019-03/jpa-demo/src/main/java/geektime/spring/springbucks/jpademo/repository/CoffeeOrderRepository.java b/FAQ 2019-03/jpa-demo/src/main/java/geektime/spring/springbucks/jpademo/repository/CoffeeOrderRepository.java
new file mode 100644
index 0000000..aaf1c4e
--- /dev/null
+++ b/FAQ 2019-03/jpa-demo/src/main/java/geektime/spring/springbucks/jpademo/repository/CoffeeOrderRepository.java
@@ -0,0 +1,7 @@
+package geektime.spring.springbucks.jpademo.repository;
+
+import geektime.spring.springbucks.jpademo.model.CoffeeOrder;
+import org.springframework.data.repository.CrudRepository;
+
+public interface CoffeeOrderRepository extends CrudRepository {
+}
diff --git a/FAQ 2019-03/jpa-demo/src/main/java/geektime/spring/springbucks/jpademo/repository/CoffeeRepository.java b/FAQ 2019-03/jpa-demo/src/main/java/geektime/spring/springbucks/jpademo/repository/CoffeeRepository.java
new file mode 100644
index 0000000..1ed18ca
--- /dev/null
+++ b/FAQ 2019-03/jpa-demo/src/main/java/geektime/spring/springbucks/jpademo/repository/CoffeeRepository.java
@@ -0,0 +1,7 @@
+package geektime.spring.springbucks.jpademo.repository;
+
+import geektime.spring.springbucks.jpademo.model.Coffee;
+import org.springframework.data.repository.CrudRepository;
+
+public interface CoffeeRepository extends CrudRepository {
+}
diff --git a/FAQ 2019-03/jpa-demo/src/main/resources/application.properties b/FAQ 2019-03/jpa-demo/src/main/resources/application.properties
new file mode 100644
index 0000000..5494f31
--- /dev/null
+++ b/FAQ 2019-03/jpa-demo/src/main/resources/application.properties
@@ -0,0 +1,7 @@
+spring.jpa.hibernate.ddl-auto=create-drop
+spring.jpa.properties.hibernate.show_sql=true
+spring.jpa.properties.hibernate.format_sql=true
+
+spring.datasource.url=jdbc:mysql://localhost/springbucks?useSSL=false
+spring.datasource.username=springbucks
+spring.datasource.password=springbucks
diff --git a/FAQ 2019-03/jpa-demo/src/test/java/geektime/spring/springbucks/jpademo/JpaDemoApplicationTests.java b/FAQ 2019-03/jpa-demo/src/test/java/geektime/spring/springbucks/jpademo/JpaDemoApplicationTests.java
new file mode 100644
index 0000000..384e947
--- /dev/null
+++ b/FAQ 2019-03/jpa-demo/src/test/java/geektime/spring/springbucks/jpademo/JpaDemoApplicationTests.java
@@ -0,0 +1,17 @@
+package geektime.spring.springbucks.jpademo;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class JpaDemoApplicationTests {
+
+ @Test
+ public void contextLoads() {
+ }
+
+}
+
diff --git a/FAQ 2019-03/stream-demo/.gitignore b/FAQ 2019-03/stream-demo/.gitignore
new file mode 100644
index 0000000..c456c4a
--- /dev/null
+++ b/FAQ 2019-03/stream-demo/.gitignore
@@ -0,0 +1,25 @@
+/target/
+!.mvn/wrapper/maven-wrapper.jar
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+/build/
diff --git a/FAQ 2019-03/stream-demo/pom.xml b/FAQ 2019-03/stream-demo/pom.xml
new file mode 100644
index 0000000..dfb0d5c
--- /dev/null
+++ b/FAQ 2019-03/stream-demo/pom.xml
@@ -0,0 +1,30 @@
+
+
+ 4.0.0
+
+ geektime.spring.faq
+ stream-demo
+ 0.0.1-SNAPSHOT
+ jar
+
+
+ UTF-8
+ 1.8
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+ ${java.version}
+ ${project.build.sourceEncoding}
+
+
+
+
+
\ No newline at end of file
diff --git a/FAQ 2019-03/stream-demo/src/main/java/geektime/spring/faq/Demo.java b/FAQ 2019-03/stream-demo/src/main/java/geektime/spring/faq/Demo.java
new file mode 100644
index 0000000..ed1f6d5
--- /dev/null
+++ b/FAQ 2019-03/stream-demo/src/main/java/geektime/spring/faq/Demo.java
@@ -0,0 +1,19 @@
+package geektime.spring.faq;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class Demo {
+ public static void main(String[] args) {
+ Arrays.asList("Foo", "Bar").stream()
+ .filter(s -> s.equalsIgnoreCase("foo"))
+ .map(s -> s.toUpperCase())
+ .forEach(System.out::println);
+
+ Arrays.stream(new String[] { "s1", "s2", "s3" })
+ .map(s -> Arrays.asList(s))
+ .flatMap(l -> l.stream())
+ .forEach(System.out::println);
+ }
+}