Preface xv Acknowledgments xvii Chapter 1: Fundamental Programming Structures 1 1.1 Our First Program 1 1.2 Primitive Types 12 1.3 Variables 15 1.4 Arithmetic Operations 18 1.5 Strings 25 1.6 Input and Output 36 1.7 Control Flow 40 1.
8 Arrays and Array Lists 48 1.9 Functional Decomposition 58 1.10 Exercises 60 Chapter 2: Object-Oriented Programming 63 2.1 Working with Objects 63 2.2 Implementing Classes 68 2.3 Object Construction 73 2.4 Records 78 2.5 Static Variables and Methods 81 2.
6 Packages 85 2.7 Nested Classes 92 2.8 Documentation Comments 97 2.9 Exercises 102 Chapter 3: Interfaces and Lambda Expressions 105 3.1 Interfaces 106 3.2 Static, Default, and Private Methods 113 3.3 Examples of Interfaces 117 3.4 Lambda Expressions 121 3.
5 Method and Constructor References 124 3.6 Processing Lambda Expressions 126 3.7 Lambda Expressions and Variable Scope 131 3.8 Higher-Order Functions 135 3.9 Local and Anonymous Classes 137 3.10 Exercises 139 Chapter 4: Inheritance and Reflection 141 4.1 Extending a Class 142 4.2 Inheritance Hierarchies 148 4.
3 Object: The Cosmic Superclass 155 4.4 Enumerations 164 4.5 Pattern Matching 168 4.6 Runtime Type Information and Resources 174 4.7 Reflection 183 4.8 Exercises 192 Chapter 5: Exceptions, Assertions, and Logging 195 5.1 Exception Handling 195 5.2 Assertions 208 5.
3 Logging 210 5.4 Exercises 219 Chapter 6: Generic Programming 221 6.1 Generic Classes 222 6.2 Generic Methods 222 6.3 Type Bounds 223 6.4 Type Variance and Wildcards 224 6.5 Generics in the Java Virtual Machine 230 6.6 Restrictions on Generics 233 6.
7 Reflection and Generics 240 6.8 Exercises 243 Chapter 7: Collections 247 7.1 An Overview of the Collections Framework 247 7.2 Iterators 253 7.3 Sets 254 7.4 Maps 256 7.5 Other Collections 262 7.6 Views 269 7.
7 Exercises 271 Chapter 8: Streams 275 8.1 From Iterating to Stream Operations 275 8.2 Stream Creation 277 8.3 The filter, map, and flatMap Methods 280 8.4 Extracting Substreams and Combining Streams 282 8.5 Other Stream Transformations 283 8.6 Simple Reductions 284 8.7 The Optional Type 285 8.
8 Collecting Results 290 8.9 Collecting into Maps 291 8.10 Grouping and Partitioning 293 8.11 Downstream Collectors 294 8.12 Reduction Operations 296 8.13 Primitive Type Streams 298 8.14 Parallel Streams 299 8.15 Exercises 302 Chapter 9: Processing Input and Output 305 9.
1 Input/Output Streams, Readers, and Writers 305 9.2 Paths, Files, and Directories 317 9.3 HTTP Connections 325 9.4 Regular Expressions 328 9.5 Serialization 340 9.6 Exercises 350 Chapter 10: Concurrent Programming 353 10.1 Concurrent Tasks 354 10.2 Thread Safety 361 10.
3 Threadsafe Data Structures 367 10.4 Parallel Algorithms 371 10.5 Asynchronous Computations 373 10.6 Atomic Counters and Accumulators 380 10.7 Locks and Conditions 383 10.8 Threads 388 10.9 Processes 392 10.10 Exercises 397 Chapter 11: Annotations 403 11.
1 Using Annotations 404 11.2 Defining Annotations 409 11.3 Annotations in the Java API 412 11.4 Processing Annotations at Runtime 416 11.5 Source-Level Annotation Processing 419 11.6 Exercises 423 Chapter 12: The Java Platform Module System 425 12.1 The Module Concept 426 12.2 Naming Modules 427 12.
3 The Modular "Hello, World!" Program 428 12.4 Requiring Modules 429 12.5 Exporting Packages 431 12.6 Modules and Reflective Access 435 12.7 Modular JARs 438 12.8 Automatic Modules 439 12.9 The Unnamed Module 441 12.10 Command-Line Flags for Migration 441 12.
11 Transitive and Static Requirements 443 12.12 Qualified Exporting and Opening 444 12.13 Service Loading 445 12.14 Tools for Working with Modules 446 12.15 Exercises 449 Index 451.